function getHandler($nsname)
 {
     if (!array_key_exists($nsname, $this->fieldset_types)) {
         // unfortunately, we need to do a bit more spelunking here.
         // if its conditional, we use a different item.  ns is unsufficient.
         //
         // FIXME this is slightly wasteful from a performance POV, though DB caching should make it OK.
         $oFieldset =& KTFieldset::getByNamespace($nsname);
         if (PEAR::isError($oFieldset)) {
             global $default;
             $default->log->error('Could not resolve Fieldset by namespace: ' . $nsname . '. Error: ' . $oFieldset->getMessage());
             return 'SimpleFieldsetDisplay';
         }
         if (is_a($oFieldset, 'KTEntityNoObjects')) {
             global $default;
             $default->log->error('Could not resolve Fieldset by namespace: ' . $nsname . '. Error: KTEntityNoObjects returned.');
             return 'SimpleFieldsetDisplay';
         }
         if ($oFieldset->getIsConditional() && KTMetadataUtil::validateCompleteness($oFieldset)) {
             return 'ConditionalFieldsetDisplay';
         } else {
             return 'SimpleFieldsetDisplay';
         }
     } else {
         return $this->fieldset_types[$nsname];
     }
 }
 function validateMetadata(&$oDocument, $aMetadata)
 {
     $aFieldsets =& KTFieldset::getGenericFieldsets();
     $aFieldsets =& kt_array_merge($aFieldsets, KTFieldset::getForDocumentType($oDocument->getDocumentTypeId()));
     $aSimpleMetadata = array();
     foreach ($aMetadata as $aSingleMetadatum) {
         list($oField, $sValue) = $aSingleMetadatum;
         if (is_null($oField)) {
             continue;
         }
         $aSimpleMetadata[$oField->getId()] = $sValue;
     }
     $aFailed = array();
     foreach ($aFieldsets as $oFieldset) {
         $aFields =& $oFieldset->getFields();
         $aFieldValues = array();
         $isRealConditional = $oFieldset->getIsConditional() && KTMetadataUtil::validateCompleteness($oFieldset);
         foreach ($aFields as $oField) {
             $v = KTUtil::arrayGet($aSimpleMetadata, $oField->getId());
             if ($oField->getIsMandatory() && !$isRealConditional) {
                 if (empty($v)) {
                     // XXX: What I'd do for a setdefault...
                     $aFailed['field'][$oField->getId()] = 1;
                 }
             }
             if (!empty($v)) {
                 $aFieldValues[$oField->getId()] = $v;
             }
         }
         if ($isRealConditional) {
             $res = KTMetadataUtil::getNext($oFieldset, $aFieldValues);
             if ($res) {
                 foreach ($res as $aMDSet) {
                     if ($aMDSet['field']->getIsMandatory()) {
                         $aFailed['fieldset'][$oFieldset->getId()] = 1;
                     }
                 }
             }
         }
     }
     if (!empty($aFailed)) {
         return new KTMetadataValidationError($aFailed);
     }
     return $aMetadata;
 }