Example #1
0
    def create_from_cap(self, writecap, readcap=None, deep_immutable=False, name=u"<unknown name>"):
        # this returns synchronously. It starts with a "cap string".
        assert isinstance(writecap, (str, type(None))), type(writecap)
        assert isinstance(readcap,  (str, type(None))), type(readcap)

        bigcap = writecap or readcap
        if not bigcap:
            # maybe the writecap was hidden because we're in a readonly
            # directory, and the future cap format doesn't have a readcap, or
            # something.
            return UnknownNode(None, None)  # deep_immutable and name not needed

        # The name doesn't matter for caching since it's only used in the error
        # attribute of an UnknownNode, and we don't cache those.
        if deep_immutable:
            memokey = "I" + bigcap
        else:
            memokey = "M" + bigcap
        if memokey in self._node_cache:
            return self._node_cache[memokey]
        cap = uri.from_string(bigcap, deep_immutable=deep_immutable, name=name)
        node = self._create_from_single_cap(cap)
        if node:
            self._node_cache[memokey] = node  # note: WeakValueDictionary
        else:
            # don't cache UnknownNode
            node = UnknownNode(writecap, readcap, deep_immutable=deep_immutable, name=name)
        return node
Example #2
0
    def create_from_cap(self,
                        writecap,
                        readcap=None,
                        deep_immutable=False,
                        name=u"<unknown name>"):
        # this returns synchronously. It starts with a "cap string".
        assert isinstance(writecap, (str, type(None))), type(writecap)
        assert isinstance(readcap, (str, type(None))), type(readcap)

        bigcap = writecap or readcap
        if not bigcap:
            # maybe the writecap was hidden because we're in a readonly
            # directory, and the future cap format doesn't have a readcap, or
            # something.
            return UnknownNode(None,
                               None)  # deep_immutable and name not needed

        # The name doesn't matter for caching since it's only used in the error
        # attribute of an UnknownNode, and we don't cache those.
        if deep_immutable:
            memokey = "I" + bigcap
        else:
            memokey = "M" + bigcap
        if memokey in self._node_cache:
            node = self._node_cache[memokey]
        else:
            cap = uri.from_string(bigcap,
                                  deep_immutable=deep_immutable,
                                  name=name)
            node = self._create_from_single_cap(cap)
            if node:
                self._node_cache[memokey] = node  # note: WeakValueDictionary
            else:
                # don't cache UnknownNode
                node = UnknownNode(writecap,
                                   readcap,
                                   deep_immutable=deep_immutable,
                                   name=name)

        if self.blacklist:
            si = node.get_storage_index()
            # if this node is blacklisted, return the reason, otherwise return None
            reason = self.blacklist.check_storageindex(si)
            if reason is not None:
                # The original node object is cached above, not the ProhibitedNode wrapper.
                # This ensures that removing the blacklist entry will make the node
                # accessible if create_from_cap is called again.
                node = ProhibitedNode(node, reason)
        return node
Example #3
0
    def create_from_cap(self, writecap, readcap=None, deep_immutable=False, name=u"<unknown name>"):
        # this returns synchronously. It starts with a "cap string".
        assert isinstance(writecap, (str, type(None))), type(writecap)
        assert isinstance(readcap,  (str, type(None))), type(readcap)

        bigcap = writecap or readcap
        if not bigcap:
            # maybe the writecap was hidden because we're in a readonly
            # directory, and the future cap format doesn't have a readcap, or
            # something.
            return UnknownNode(None, None)  # deep_immutable and name not needed

        # The name doesn't matter for caching since it's only used in the error
        # attribute of an UnknownNode, and we don't cache those.
        if deep_immutable:
            memokey = "I" + bigcap
        else:
            memokey = "M" + bigcap
        if memokey in self._node_cache:
            node = self._node_cache[memokey]
        else:
            cap = uri.from_string(bigcap, deep_immutable=deep_immutable,
                                  name=name)
            node = self._create_from_single_cap(cap)

            # node is None for an unknown URI, otherwise it is a type for which
            # is_mutable() is known. We avoid cacheing mutable nodes due to
            # ticket #1679.
            if node is None:
                # don't cache UnknownNode
                node = UnknownNode(writecap, readcap,
                                   deep_immutable=deep_immutable, name=name)
            elif node.is_mutable():
                self._node_cache[memokey] = node  # note: WeakValueDictionary

        if self.blacklist:
            si = node.get_storage_index()
            # if this node is blacklisted, return the reason, otherwise return None
            reason = self.blacklist.check_storageindex(si)
            if reason is not None:
                # The original node object is cached above, not the ProhibitedNode wrapper.
                # This ensures that removing the blacklist entry will make the node
                # accessible if create_from_cap is called again.
                node = ProhibitedNode(node, reason)
        return node