'Manages ascynchronous connections'

@web.expose
def index(self, trans, tool_id=None, data_secret=None, **kwd):

    if (tool_id is None):
        return 'tool_id    argument    is    required'
    tool_id = str(tool_id)
    if (not kwd):
        return trans.response.send_redirect('/index')
    params = Params(kwd, sanitize=False)
    STATUS = params.STATUS
    URL = params.URL
    data_id = params.data_id
    log.debug(('async    dataid    ->    %s' % data_id))
    trans.log_event(('Async    dataid    ->    %s' % str(data_id)))
    toolbox = self.get_toolbox()
    tool = toolbox.get_tool(tool_id)
    if (not tool):
        return ('Tool    with    id    %s    not    found' % tool_id)
    if data_id:
        if (not URL):
            return ('No    URL    parameter    was    submitted    for    data    %s' % data_id)
        data = trans.sa_session.query(trans.model.HistoryDatasetAssociation).get(data_id)
        if (not data):
            return ('Data    %s    does    not    exist    or    has    already    been    deleted' % data_id)
        if (STATUS == 'OK'):
            key = hmac_new(trans.app.config.tool_secret, ('%d:%d' % (data.id, data.history_id)))
            if (key != data_secret):
                return ('You    do    not    have    permission    to    alter    data    %s.' % data_id)
            data.state = data.blurb = data.states.RUNNING
            log.debug(('executing    tool    %s' % tool.id))
            trans.log_event(('Async    executing    tool    %s' % tool.id), tool_id=tool.id)
            galaxy_url = (trans.request.base + ('/async/%s/%s/%s' % (tool_id, data.id, key)))
            galaxy_url = params.get('GALAXY_URL', galaxy_url)
            params = dict(URL=URL, GALAXY_URL=galaxy_url, name=data.name, info=data.info, dbkey=data.dbkey, data_type=data.ext)
            TOOL_OUTPUT_TYPE = None
            for (idx, obj) in enumerate(tool.outputs.values()):
                try:
                    TOOL_OUTPUT_TYPE = obj.format
                    params[tool.outputs.keys()[idx]] = data.id
                    break
                except Exception:
                    continue
            if (TOOL_OUTPUT_TYPE is None):
                raise Exception('Error:    ToolOutput    object    not    found')
            original_history = trans.sa_session.query(trans.app.model.History).get(data.history_id)
            tool.execute(trans, incoming=params, history=original_history)
        else:
            log.debug(('async    error    ->    %s' % STATUS))
            trans.log_event(('Async    error    ->    %s' % STATUS))
            data.state = data.blurb = jobs.JOB_ERROR
            data.info = ('Error    ->    %s' % STATUS)
        trans.sa_session.flush()
        return ('Data    %s    with    status    %s    received.    OK' % (data_id, STATUS))
    else:
        GALAXY_TYPE = None
        if params.data_type:
            GALAXY_TYPE = params.data_type
        elif (params.galaxyFileFormat == 'wig'):
            GALAXY_TYPE = 'wig'
        elif params.GALAXY_TYPE:
            GALAXY_TYPE = params.GALAXY_TYPE
        else:
            outputs_count = 0
            for obj in tool.outputs.values():
                try:
                    GALAXY_TYPE = obj.format
                    outputs_count += 1
                except Exception:
                    continue
            if (outputs_count > 1):
                raise Exception('Error:    the    tool    should    have    just    one    output')
        if (GALAXY_TYPE is None):
            raise Exception('Error:    ToolOutput    object    not    found')
        GALAXY_NAME = (params.name or params.GALAXY_NAME or ('%s    query' % tool.name))
        GALAXY_INFO = (params.info or params.GALAXY_INFO or params.galaxyDescription or '')
        GALAXY_BUILD = (params.dbkey or params.GALAXY_BUILD or params.galaxyFreeze or '?')
        data = trans.app.model.HistoryDatasetAssociation(create_dataset=True, sa_session=trans.sa_session, extension=GALAXY_TYPE)
        trans.app.security_agent.set_all_dataset_permissions(data.dataset, trans.app.security_agent.history_get_default_permissions(trans.history))
        data.name = GALAXY_NAME
        data.dbkey = GALAXY_BUILD
        data.info = GALAXY_INFO
        trans.sa_session.add(data)
        data.state = data.states.NEW
        open(data.file_name, 'wb').close()
        trans.history.add_dataset(data, genome_build=GALAXY_BUILD)
        trans.sa_session.add(trans.history)
        trans.sa_session.flush()
        trans.log_event(('Added    dataset    %d    to    history    %d' % (data.id, trans.history.id)), tool_id=tool_id)
        try:
            key = hmac_new(trans.app.config.tool_secret, ('%d:%d' % (data.id, data.history_id)))
            galaxy_url = (trans.request.base + ('/async/%s/%s/%s' % (tool_id, data.id, key)))
            params.update({'GALAXY_URL': galaxy_url})
            params.update({'data_id': data.id})
            url = (URL or tool.action)
            if ('?' in url):
                url_join_char = '&'
            else:
                url_join_char = '?'
            url = ('%s%s%s' % (url, url_join_char, urllib.urlencode(params.flatten())))
            log.debug(('connecting    to    ->    %s' % url))
            trans.log_event(('Async    connecting    to    ->    %s' % url))
            text = urllib.urlopen(url).read((-1))
            text = text.strip()
            if (not text.endswith('OK')):
                raise Exception(text)
            data.state = data.blurb = data.states.RUNNING
        except Exception as e:
            data.info = str(e)
            data.state = data.blurb = data.states.ERROR
        trans.sa_session.flush()
    return trans.fill_template('root/tool_runner.mako', out_data={}, num_jobs=1, job_errors=[])
