'create( self, trans, library_id, payload, **kwd )
* POST /api/libraries/{library_id}/contents:
create a new library file or folder
To copy an HDA into a library send ``create_type`` of \'file\' and
the HDA\'s encoded id in ``from_hda_id`` (and optionally ``ldda_message``).
To copy an HDCA into a library send ``create_type`` of \'file\' and
the HDCA\'s encoded id in ``from_hdca_id`` (and optionally ``ldda_message``).
:type   library_id: str
:param  library_id: the encoded id of the library where to create the new item
:type   payload:    dict
:param  payload:    dictionary structure containing:
* folder_id:    the encoded id of the parent folder of the new item
* create_type:  the type of item to create (\'file\', \'folder\' or \'collection\')
* from_hda_id:  (optional, only if create_type is \'file\') the
encoded id of an accessible HDA to copy into the library
* ldda_message: (optional) the new message attribute of the LDDA created
* extended_metadata: (optional) sub-dictionary containing any extended
metadata to associate with the item
* upload_option: (optional) one of \'upload_file\' (default), \'upload_directory\' or \'upload_paths\'
* server_dir: (optional, only if upload_option is
\'upload_directory\') relative path of the subdirectory of Galaxy
``library_import_dir`` to upload. All and only the files (i.e.
no subdirectories) contained in the specified directory will be
uploaded.
* filesystem_paths: (optional, only if upload_option is
\'upload_paths\' and the user is an admin) file paths on the
Galaxy server to upload to the library, one file per line
* link_data_only: (optional, only when upload_option is
\'upload_directory\' or \'upload_paths\') either \'copy_files\'
(default) or \'link_to_files\'. Setting to \'link_to_files\'
symlinks instead of copying the files
* name: (optional, only if create_type is \'folder\') name of the
folder to create
* description: (optional, only if create_type is \'folder\')
description of the folder to create
* tag_using_filename: (optional)
create tags on datasets using the file\'s original name
:returns:   a dictionary describing the new item unless ``from_hdca_id`` is supplied,
in that case a list of such dictionaries is returned.
:rtype:     object'

@web.expose_api
def create(self, trans, library_id, payload, **kwd):

    if ('create_type' not in payload):
        trans.response.status = 400
        return "Missing    required    'create_type'    parameter."
    else:
        create_type = payload.pop('create_type')
    if (create_type not in ('file', 'folder', 'collection')):
        trans.response.status = 400
        return ("Invalid    value    for    'create_type'    parameter    (    %s    )    specified." % create_type)
    if ('folder_id' not in payload):
        trans.response.status = 400
        return "Missing    required    'folder_id'    parameter."
    else:
        folder_id = payload.pop('folder_id')
        (class_name, folder_id) = self.__decode_library_content_id(folder_id)
    try:
        parent = self.get_library_folder(trans, folder_id, check_ownership=False, check_accessible=False)
    except Exception as e:
        return str(e)
    real_folder_id = trans.security.encode_id(parent.id)
    (from_hda_id, from_hdca_id, ldda_message) = (payload.pop('from_hda_id', None), payload.pop('from_hdca_id', None), payload.pop('ldda_message', ''))
    if (create_type == 'file'):
        if from_hda_id:
            return self._copy_hda_to_library_folder(trans, self.hda_manager, self.decode_id(from_hda_id), real_folder_id, ldda_message)
        if from_hdca_id:
            return self._copy_hdca_to_library_folder(trans, self.hda_manager, self.decode_id(from_hdca_id), real_folder_id, ldda_message)
    ex_meta_payload = payload.pop('extended_metadata', None)
    if (create_type == 'file'):
        (status, output) = trans.webapp.controllers['library_common'].upload_library_dataset(trans, 'api', library_id, real_folder_id, **payload)
    elif (create_type == 'folder'):
        (status, output) = trans.webapp.controllers['library_common'].create_folder(trans, 'api', real_folder_id, library_id, **payload)
    elif (create_type == 'collection'):
        self.check_user_can_add_to_library_item(trans, parent, check_accessible=True)
        create_params = api_payload_to_create_params(payload)
        create_params['parent'] = parent
        service = trans.app.dataset_collections_service
        dataset_collection_instance = service.create(**create_params)
        return [dictify_dataset_collection_instance(dataset_collection_instance, security=trans.security, parent=parent)]
    if (status != 200):
        trans.response.status = status
        return output
    else:
        rval = []
        for v in output.values():
            if (ex_meta_payload is not None):
                ex_meta = ExtendedMetadata(ex_meta_payload)
                trans.sa_session.add(ex_meta)
                v.extended_metadata = ex_meta
                trans.sa_session.add(v)
                trans.sa_session.flush()
                for (path, value) in self._scan_json_block(ex_meta_payload):
                    meta_i = ExtendedMetadataIndex(ex_meta, path, value)
                    trans.sa_session.add(meta_i)
                trans.sa_session.flush()
            if (type(v) == trans.app.model.LibraryDatasetDatasetAssociation):
                v = v.library_dataset
            encoded_id = trans.security.encode_id(v.id)
            if (create_type == 'folder'):
                encoded_id = ('F' + encoded_id)
            rval.append(dict(id=encoded_id, name=v.name, url=url_for('library_content', library_id=library_id, id=encoded_id)))
        return rval
