protected static function findReference($refRef, EarthIT_Schema_ResourceClass $rc, EarthIT_Schema $schema = null, &$refName = null, &$refIsPlural = null, $fuzzyMatch = true) { $refRef = self::maybeMinimize($refRef, $fuzzyMatch); $refs = $rc->getReferences(); if ($fuzzyMatch) { foreach ($refs as $k => $ref) { if (EarthIT_Schema_WordUtil::minimize($k) == $refRef) { $refName = $k; $refIsPlural = false; return $ref; } } } else { if (isset($refs[$refRef])) { $refIsPlural = false; $refName = $refRef; return $refs[$refName]; } } if ($schema !== null) { $rcs = $schema->getResourceClasses(); // Look for one based on explicit inverse name foreach ($rcs as $trcName => $trc) { foreach ($rc->getReferences() as $ref) { $refInverseName = $ref->getFirstPropertyValue(EarthIT_CMIPREST_NS::INVERSE_NAME); $refPluralInverseName = $ref->getFirstPropertyValue(EarthIT_CMIPREST_NS::INVERSE_COLLECTION_NAME, EarthIT_Schema_WordUtil::pluralize($refInverseName)); $matchRefInverseName = self::maybeMinimize($refInverseName, $fuzzyMatch); $matchRefPluralInverseName = self::maybeMinimize($refPluralInverseName, $fuzzyMatch); // plural takes priority if plural name = singular name if ($matchRefPluralInverseName == $refRef) { $refName = $refPluralInverseName; $refIsPlural = true; return new EarthIT_Schema_Reference($trcName, $ref->getTargetFieldNames(), $ref->getOriginFieldNames()); } if ($matchRefInverseName == $refRef) { $refName = $refInverseName; $refIsPlural = false; return new EarthIT_Schema_Reference($trcName, $ref->getTargetFieldNames(), $ref->getOriginFieldNames()); } } } // Look for one based on class name = ref ref foreach ($rcs as $trcName => $trc) { $trcCollectionName = $trc->getFirstPropertyValue(self::COLLECTION_NAME, EarthIT_Schema_WordUtil::pluralize($trcName)); $matchTrcCollectionName = self::maybeMinimize($trcCollectionName, $fuzzyMatch); $matchTrcName = self::maybeMinimize($trcName, $fuzzyMatch); $found = false; // plural takes priority if plural name = singular name if ($matchTrcCollectionName == $refRef) { $found = true; $refIsPlural = true; $refName = $trcCollectionName; } else { if ($matchTrcName == $refRef) { $found = true; $refIsPlural = false; $refName = $trcName; } } if ($found) { // Found a resource class that could work // if it has an appropriate reverse reference. foreach ($trc->getReferences() as $ref) { if ($ref->getTargetClassName() == $rc->getName()) { return new EarthIT_Schema_Reference($trcName, $ref->getTargetFieldNames(), $ref->getOriginFieldNames()); } } } } } return null; }