<commit_before>### $Id$
### $URL$

from sfa.util.faults import *
from sfa.util.method import Method
from sfa.util.parameter import Parameter, Mixed
from sfa.trust.auth import Auth
from sfa.util.record import GeniRecord
from sfa.util.debug import log

from sfa.server.registry import Registries

class resolve(Method):
    """
    Resolve a record.

    @param cred credential string authorizing the caller
    @param hrn human readable name to resolve
    @return a list of record dictionaries or empty list     
    """

    interfaces = ['registry']
    
    accepts = [
        Parameter(str, "Credential string"),
        Parameter(str, "Human readable name (hrn)")
        ]

    returns = [GeniRecord]
    
    def call(self, cred, hrn):
        
        self.api.auth.check(cred, 'resolve')
        good_records = [] 
        try:
            auth_hrn = self.api.auth.get_authority(hrn)
            if not auth_hrn:
                auth_hrn = hrn
            table = self.api.auth.get_auth_table(auth_hrn)
            records = table.resolve('*', hrn)
            if not records:
                raise RecordNotFound(hrn) 
            good_records = []
            for record in records:
                try:
                    self.api.fill_record_info(record)
                    good_records.append(record)
                except PlanetLabRecordDoesNotExist:
                    # silently drop the ones that are missing in PL
                    print >> log, "ignoring geni record ", record.get_name(), \
                              " because pl record does not exist"
                    table.remove(record)
        except:
            # is this a foreign record
            registries = Registries(self.api)
            credential = self.api.getCredential()
            for registry in registries:
                if hrn.startswith(registry) and not registry in [self.api.hrn]:
                    records = registries[registry].resolve(credential, hrn)
                    good_records = records
        dicts = [record.as_dict() for record in good_records]

        return dicts    
            <commit_msg>use a prefix tree to determine which registry inteface to contact<commit_after>### $Id$
### $URL$

from sfa.util.faults import *
from sfa.util.method import Method
from sfa.util.parameter import Parameter, Mixed
from sfa.trust.auth import Auth
from sfa.util.record import GeniRecord
from sfa.util.debug import log
from sfa.server.registry import Registries
from sfa.util.prefixTree import prefixTree

class resolve(Method):
    """
    Resolve a record.

    @param cred credential string authorizing the caller
    @param hrn human readable name to resolve
    @return a list of record dictionaries or empty list     
    """

    interfaces = ['registry']
    
    accepts = [
        Parameter(str, "Credential string"),
        Parameter(str, "Human readable name (hrn)")
        ]

    returns = [GeniRecord]
    
    def call(self, cred, hrn):
        
        self.api.auth.check(cred, 'resolve')
        good_records = [] 

        # load all know registry names into a prefix tree and attempt to find
        # the longest matching prefix
        registries = Registries(self.api)
        hrns = registries.keys()
        tree = prefixTree()
        tree.load(hrns)
        registry_hrn = tree.best_match(hrn)

        #if there was no match then this record belongs to an unknow registry
        if not registry_hrn:
            raise MissingAuthority(hrn)

        # if the best match (longest matching hrn) is not the local registry,
        # forward the request
        if registry_hrn != self.api.hrn:
            credential = self.api.getCredential()
            try:
                records = registries[registry_hrn].resolve(credential, hrn)
                good_records = [record.as_dict() for record in record_list]
                if good_records:
                    return good_records
            except:
                pass 

        # if we still havnt found the record yet, try the local registry
        auth_hrn = self.api.auth.get_authority(hrn)
        if not auth_hrn:
            auth_hrn = hrn
        table = self.api.auth.get_auth_table(auth_hrn)
        records = table.resolve('*', hrn)
        if not records:
            raise RecordNotFound(hrn) 
        for record in records:
            try:
                self.api.fill_record_info(record)
                good_records.append(dict(record))
            except PlanetLabRecordDoesNotExist:
                raise
                # silently drop the ones that are missing in PL
                print >> log, "ignoring geni record ", record.get_name(), \
                              " because pl record does not exist"
                table.remove(record)


        return good_records    
            
{'fraction_non_alphanumeric': 0.07609371760315156, 'fraction_numerical': 0.0, 'mean_word_length': 1.8612099644128113, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4516648', 'n_tokens_mistral': 1342, 'n_tokens_neox': 1277, 'n_words': 399}