7de3069f4395af52d10e69722052094ff42268ce
jcasper
  Fri Jun 16 20:05:58 2017 -0700
Initial commit of hgLinkIn tool to translate external identifiers to genome positions, refs #16668

diff --git src/hg/hgLinkIn/hgLinkIn.c src/hg/hgLinkIn/hgLinkIn.c
new file mode 100644
index 0000000..4eacb0b
--- /dev/null
+++ src/hg/hgLinkIn/hgLinkIn.c
@@ -0,0 +1,133 @@
+/* Copyright (C) 2017 The Regents of the University of California
+ * See README in this or parent directory for licensing information. */
+
+/* hgLinkIn - Link external IDs to an assembly and a position. */
+
+#include "common.h"
+#include "linefile.h"
+#include "hash.h"
+#include "options.h"
+#include "jksql.h"
+#include "htmshell.h"
+#include "web.h"
+#include "cheapcgi.h"
+#include "cart.h"
+#include "hui.h"
+#include "udc.h"
+#include "knetUdc.h"
+#include "genbank.h"
+#include "memalloc.h"
+
+#include "linkInHandlers.h"
+#include "handlerList.h"
+
+
+/* Global Variables */
+struct cart *cart;             /* CGI and other variables */
+struct hash *oldVars = NULL;
+
+
+void displayLinkInResults(char *linkInId, char *linkInResource, struct linkInResult *results)
+/* Take the list of results and display them.  Here, that generally means redirecting to
+ * hgTracks with a db and position. */
+{
+/* If only one result, jump to it.  Otherwise, for now, jump to the first */
+int hitCount = slCount(results);
+if (hitCount == 0)
+    {
+    printf ("Error: No results found for ID %s", linkInId);
+    if (linkInResource != NULL)
+        printf (" in database %s\n", linkInResource);
+    }
+else if (hitCount == 1)
+    {
+    char url[2048];
+    safef(url, sizeof(url), "../cgi-bin/hgTracks?db=%s&position=%s&%s=pack",
+            results->db, results->position, results->trackToView);
+    char redirect[4096];
+    safef(redirect, sizeof(redirect), "window.location='%s';", url);
+    jsInline(redirect);
+    printf("Redirecting to <a href='%s'>%s</a>.", url, url);
+    }
+else
+    {
+    // Multiple hits
+    char url[2048];
+    safef(url, sizeof(url), "../cgi-bin/hgTracks?db=%s&position=%s&%s=pack",
+            results->db, results->position, results->trackToView);
+    char redirect[4096];
+    safef(redirect, sizeof(redirect), "window.location='%s';", url);
+    jsInline(redirect);
+    printf("Redirecting to <a href='%s'>%s</a>.", url, url);
+    }
+}
+
+
+void hgLinkIn(struct cart *theCart)
+/* Perform a search for an identifier supplied in the cart, or squack that
+ * no identifier was provided. */
+{
+struct linkInResult *results = NULL;
+registerLinkInHandlers();
+
+char *linkInResource = cartOptionalString(theCart, "resource");
+char *linkInId = cartOptionalString(theCart, "id");
+
+if (isEmpty(linkInId))
+    {
+    /* user never gave us an ID; display interface */
+    warn("No ID supplied - must specify id=&ltid&gt in URL. Interactive "
+            "mode not yet implemented.");
+        return;
+    }
+
+if (isEmpty(linkInResource) || sameString(linkInResource, "all"))
+    {
+    /* try all possible linkIns for a list of results */
+    results = checkAllLinkInHandlers(linkInId);
+    }
+else
+    {
+    /* dispatch a single linkIn handler based on the id (if we have that handler) */
+    results = checkLinkInHandlerForResource(linkInResource, linkInId);
+    }
+displayLinkInResults(linkInId, linkInResource, results);
+}
+
+
+void doMiddle(struct cart *theCart)
+/* Set up globals and make web page */
+{
+cart = theCart;
+char *database = NULL;
+char *genome = NULL;
+getDbAndGenome(cart, &database, &genome, oldVars);
+initGenbankTableNames(database);
+
+int timeout = cartUsualInt(cart, "udcTimeout", 300);
+if (udcCacheTimeout() < timeout)
+    udcSetCacheTimeout(timeout);
+knetUdcInstall();
+
+cartWebStart(cart, database, "Link external IDs to an assembly and a position");
+hgLinkIn(cart);
+cartWebEnd();
+}
+
+
+
+/* Null terminated list of CGI Variables we don't want to save
+ * permanently. */
+char *excludeVars[] = {"Submit", "submit", "resource", "id", NULL,};
+
+int main(int argc, char *argv[])
+/* Process command line. */
+{
+pushCarefulMemHandler(LIMIT_2or6GB);
+htmlPushEarlyHandlers(); /* Make errors legible during initialization. */
+cgiSpoof(&argc, argv);
+
+cartEmptyShell(doMiddle, hUserCookie(), excludeVars, oldVars);
+
+return 0;
+}