'Execute using application.'

def execute_via_app(self, tool, app, session_id, history_id, user=None, incoming={}, set_output_hid=False, overwrite=True, history=None, job_params=None):

    for (name, value) in incoming.items():
        if isinstance(value, app.model.HistoryDatasetAssociation):
            dataset = value
            dataset_name = name
            type = 'hda'
            break
        elif isinstance(value, app.model.LibraryDatasetDatasetAssociation):
            dataset = value
            dataset_name = name
            type = 'ldda'
            break
        else:
            raise Exception('The    dataset    to    set    metadata    on    could    not    be    determined.')
    sa_session = app.model.context
    job = app.model.Job()
    job.session_id = session_id
    job.history_id = history_id
    job.tool_id = tool.id
    if user:
        job.user_id = user.id
    if job_params:
        job.params = dumps(job_params)
    start_job_state = job.state
    try:
        job.tool_version = tool.version
    except:
        job.tool_version = '1.0.1'
    job.state = job.states.WAITING
    job.set_handler(tool.get_job_handler(job_params))
    sa_session.add(job)
    sa_session.flush()
    incoming['__ORIGINAL_DATASET_STATE__'] = dataset.state
    input_paths = [DatasetPath(dataset.id, real_path=dataset.file_name, mutable=False)]
    app.object_store.create(job, base_dir='job_work', dir_only=True, extra_dir=str(job.id))
    job_working_dir = app.object_store.get_filename(job, base_dir='job_work', dir_only=True, extra_dir=str(job.id))
    external_metadata_wrapper = JobExternalOutputMetadataWrapper(job)
    cmd_line = external_metadata_wrapper.setup_external_metadata(dataset, sa_session, exec_dir=None, tmp_dir=job_working_dir, dataset_files_path=app.model.Dataset.file_path, output_fnames=input_paths, config_root=app.config.root, config_file=app.config.config_file, datatypes_config=app.datatypes_registry.integrated_datatypes_configs, job_metadata=None, include_command=False, max_metadata_value_size=app.config.max_metadata_value_size, kwds={'overwrite': overwrite})
    incoming['__SET_EXTERNAL_METADATA_COMMAND_LINE__'] = cmd_line
    for (name, value) in tool.params_to_strings(incoming, app).items():
        job.add_parameter(name, value)
    if (type == 'hda'):
        job.add_input_dataset(dataset_name, dataset)
    elif (type == 'ldda'):
        job.add_input_library_dataset(dataset_name, dataset)
    dataset._state = dataset.states.SETTING_METADATA
    job.state = start_job_state
    sa_session.flush()
    app.job_queue.put(job.id, tool.id)
    dataset.datatype.before_setting_metadata(dataset)
    return (job, odict())
