def __params_descriptor(self, message_type, request_kind, path, method_id):
path_parameter_dict = self.__get_path_parameters(path)<EOL>if not isinstance(message_type, resource_container.ResourceContainer):<EOL><INDENT>if path_parameter_dict:<EOL><INDENT>_logger.warning('<STR_LIT>'<EOL>'<STR_LIT>'<EOL>'<STR_LIT>'<EOL>'<STR_LIT>',<EOL>method_id, type(message_type))<EOL><DEDENT>return self.__params_descriptor_without_container(<EOL>message_type, request_kind, path)<EOL><DEDENT>message_type = message_type.parameters_message_class()<EOL>params = {}<EOL>param_order = []<EOL>for field_name, matched_path_parameters in path_parameter_dict.iteritems():<EOL><INDENT>field = message_type.field_by_name(field_name)<EOL>self.__validate_path_parameters(field, matched_path_parameters)<EOL><DEDENT>for field in sorted(message_type.all_fields(), key=lambda f: f.number):<EOL><INDENT>matched_path_parameters = path_parameter_dict.get(field.name, [])<EOL>self.__add_parameters_from_field(field, matched_path_parameters,<EOL>params, param_order)<EOL><DEDENT>return params, param_order<EOL>
Describe the parameters of a method.

        If the message_type is not a ResourceContainer, will fall back to
        __params_descriptor_without_container (which will eventually be deprecated).

        If the message type is a ResourceContainer, then all path/query parameters
        will come from the ResourceContainer This method will also make sure all
        path parameters are covered by the message fields.

        Args:
          message_type: messages.Message or ResourceContainer class, Message with
            parameters to describe.
          request_kind: The type of request being made.
          path: string, HTTP path to method.
          method_id: string, Unique method identifier (e.g. 'myapi.items.method')

        Returns:
          A tuple (dict, list of string): Descriptor of the parameters, Order of the
            parameters.