def from_jabsorb(request, seems_raw=False):
    """
    Transforms a jabsorb request into a more Python data model (converts maps
    and lists)

    :param request: Data coming from Jabsorb
    :param seems_raw: Set it to True if the given data seems to already have
                      been parsed (no Java class hint). If True, the lists will
                      be kept as lists instead of being converted to tuples.
    :return: A Python representation of the given data
    """
    if isinstance(request, (tuple, set, frozenset)):
        # Special case : JSON arrays (Python lists)
        return type(request)(from_jabsorb(element) for element in request)

    elif isinstance(request, list):
        # Check if we were a list or a tuple
        if seems_raw:
            return list(from_jabsorb(element) for element in request)

        return tuple(from_jabsorb(element) for element in request)

    elif isinstance(request, dict):
        # Dictionary
        java_class = request.get(JAVA_CLASS)
        json_class = request.get(JSON_CLASS)
        seems_raw = not java_class and not json_class

        if java_class:
            # Java Map ?
            if JAVA_MAPS_PATTERN.match(java_class) is not None:
                return HashableDict(
                    (from_jabsorb(key), from_jabsorb(value))
                    for key, value in request["map"].items()
                )

            # Java List ?
            elif JAVA_LISTS_PATTERN.match(java_class) is not None:
                return HashableList(
                    from_jabsorb(element) for element in request["list"]
                )

            # Java Set ?
            elif JAVA_SETS_PATTERN.match(java_class) is not None:
                return HashableSet(
                    from_jabsorb(element) for element in request["set"]
                )

        # Any other case
        result = AttributeMap(
            (from_jabsorb(key), from_jabsorb(value, seems_raw))
            for key, value in request.items()
        )

        # Keep JSON class information as is
        if json_class:
            result[JSON_CLASS] = json_class

        return result

    elif not _is_builtin(request):
        # Bean
        for attr in dir(request):
            # Only convert public fields
            if not attr[0] == "_":
                # Field conversion
                setattr(request, attr, from_jabsorb(getattr(request, attr)))

        return request

    else:
        # Any other case
        return request