def get_full_spec_file_name(default_fsf, l):
    """ Get full-spec filename for given language

    * General spec is always named exactly as ``default_fsf``
    * If there's at least one ``.`` in ``default_fsf``, then the right-most one
      is replaced by ``.{language}.``, e.g. ``full_spec.yaml`` becomes
      ``full_spec.java.yaml``
    * If there's no dot in ``default_fsf``, then ``.{language}`` is appended,
      e.g. ``full_spec`` becomes ``full_spec.java``

    :param default_fsf: a filename for the general spec
    :type default_fsf: ``str``
    :param l: language to construct the spec name for
    :type l: ``str`` or ``NoneType``
    """
    if l is None:
        return default_fsf
    if '.' in default_fsf:
        return default_fsf[::-1].replace('.', '.{}.'.format(l[::-1]), 1)[::-1]
    return '{}.{}'.format(default_fsf, l)
