6eacdcdb29afdeefa7ba7a5ec1e52e13e86680f9
hiram
Wed Apr 10 14:45:45 2019 -0700
better layout for selection menus and now returning errors properly refs #18869
diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c
index 40b1708..a81f253 100644
--- src/hg/hubApi/hubApi.c
+++ src/hg/hubApi/hubApi.c
@@ -27,42 +27,42 @@
#define delayFraction 0.03
/* default is to list all trackDb entries, composite containers too.
* This option will limit to only the actual track entries with data
*/
boolean trackLeavesOnly = FALSE; /* set by CGI parameter 'trackLeavesOnly' */
/* Global only to this one source file */
static struct cart *cart; /* CGI and other variables */
static struct hash *oldVars = NULL;
static struct hash *trackCounter = NULL;
static long totalTracks = 0;
static boolean measureTiming = FALSE; /* set by CGI parameters */
static boolean allTrackSettings = FALSE; /* checkbox setting */
static char **shortLabels = NULL; /* public hub short labels in array */
-// struct hubPublic *publicHubList = NULL;
static int publicHubCount = 0;
static char *defaultHub = "Plants";
-// static char *defaultHubUrl = " http://genome-test.gi.ucsc.edu/~hiram/hubs/Plants/hub.txt";
static char *defaultDb = "ce11";
static long enteredMainTime = 0; /* will become = clock1000() on entry */
/* to allow calculation of when to bail out, taking too long */
static long timeOutSeconds = 100;
static boolean timedOut = FALSE;
static char *urlPrefix = ""; /* initalized to support self references */
+
+ /* supportedTypes will be initialized to a known supported set */
static struct slName *supportedTypes = NULL;
- /* will be initialized to a known supported set */
+
static void initSupportedTypes()
/* initalize the list of supported track types */
{
struct slName *el = newSlName("bed");
slAddHead(&supportedTypes, el);
el = newSlName("wig");
slAddHead(&supportedTypes, el);
el = newSlName("broadPeak");
slAddHead(&supportedTypes, el);
el = newSlName("narrowPeak");
slAddHead(&supportedTypes, el);
el = newSlName("bigBed");
slAddHead(&supportedTypes, el);
el = newSlName("bigWig");
@@ -217,54 +217,54 @@
boolean superChild = tdbIsSuperTrackChild(tdb);
unsigned start = chromSize / 4;
unsigned end = start + 10000;
if (end > chromSize)
end = chromSize;
char *genome = NULL;
if (hub)
genome = hub->genomeList->name;
if (db)
{
if (hub)
{
char urlReference[2048];
- safef(urlReference, sizeof(urlReference), " (sample getData)%s\n", urlPrefix, hub->url, genome, tdb->track, chrom, start, end, errorPrint);
+ safef(urlReference, sizeof(urlReference), " (sample data)%s\n", urlPrefix, hub->url, genome, tdb->track, chrom, start, end, errorPrint);
if (tdb->parent)
hPrintf("
\n");
hPrintf("Your host, %s, has been sending too many requests lately and is "
"unfairly loading our site, impacting performance for other users. "
"Please contact genome@soe.ucsc.edu to ask that your site "
"be reenabled. Also, please consider downloading sequence and/or "
"annotations in bulk -- see http://genome.ucsc.edu/downloads.html.",
hogHost);
hPrintf("
\n");
exit(0);
}
static void hogExit()
/* bottleneck server requests exit */
{
char *hogHost = getenv("REMOTE_ADDR");
char *pathInfo = getenv("PATH_INFO");
/* nothing on incoming path, then display the WEB page instead */
if (sameOk("/",pathInfo))
pathInfo = NULL;
if (isNotEmpty(pathInfo))
{
- puts("Content-Type:application/json");
- puts("Status: 459 Too Many Requests");
- /* maybe a Retry-After: 3600 statement here ? */
- puts("\n");
sendJsonHogMessage(hogHost);
}
else
{
- puts("Content-Type:text/html");
- puts("Status: 459 Too Many Requests");
- /* maybe a Retry-After: 3600 statement here ? */
- puts("\n");
sendHogMessage(hogHost);
}
+} /* static void hogExit() */
+
+/* name of button group */
+#define RADIO_GROUP "selectRadio"
+/* button functions */
+#define RADIO_PUBHUB "pubHub"
+#define RADIO_OTHERHUB "otherHub"
+#define RADIO_UCSCDB "ucscDb"
+
+static void selectionForm()
+/* setup the selection pull-downs for source */
+{
+char *hubDropDown = cartUsualString(cart, "publicHubs", defaultHub);
+char *urlDropDown = urlFromShortLabel(hubDropDown);
+char *otherHubUrl = cartUsualString(cart, "urlHub", "");
+char *ucscDb = cartUsualString(cart, "ucscGenome", defaultDb);
+
+if (isEmpty(otherHubUrl))
+ otherHubUrl = urlDropDown;
+
+char *radioOn = cartUsualString(cart, RADIO_GROUP, RADIO_PUBHUB);
+
+/* create border around table, but not inside the table with the data */
+hPrintf("\n");
+hPrintf("\n");
+
+int maxDbNameWidth = 0;
+struct dbDb *dbList = ucscDbDb();
+char **ucscDbList = NULL;
+int listSize = slCount(dbList);
+AllocArray(ucscDbList, listSize);
+struct dbDb *el = dbList;
+int ucscDataBaseCount = 0;
+for ( ; el != NULL; el = el->next )
+ {
+ ucscDbList[ucscDataBaseCount++] = el->name;
+ if (strlen(el->name) > maxDbNameWidth)
+ maxDbNameWidth = strlen(el->name);
+ }
+maxDbNameWidth += 1;
+
+hPrintf("\n");
+hPrintf(" \n");
+hPrintf(" |
\n");
+
+/* how does debug carry forward ? */
+// if (debug)
+// cgiMakeHiddenVar("debug", "1");
}
static void doMiddle(struct cart *theCart)
/* Set up globals and make web page */
{
cart = theCart;
measureTiming = hPrintStatus() && isNotEmpty(cartOptionalString(cart, "measureTiming"));
measureTiming = TRUE;
char *database = NULL;
char *genome = NULL;
cgiVarSet("ignoreCookie", "1");
getDbAndGenome(cart, &database, &genome, oldVars);
initGenbankTableNames(database);
@@ -1139,62 +1255,40 @@
pathInfo = NULL;
boolean commandError = FALSE;
/*expect no more than MAX_PATH_INFO number of words*/
char *words[MAX_PATH_INFO];
if (isNotEmpty(pathInfo))
{
setupFunctionHash();
struct hashEl *hel = parsePathInfo(pathInfo, words);
/* verify valid API command */
if (hel) /* have valid command */
{
hPrintDisable();
- /* could check botDelay here to see if 459 status is advised */
- puts("Content-Type:application/json");
- puts("\n");
void (*apiFunction)(char **) = hel->val;
(*apiFunction)(words);
return;
}
else
commandError = TRUE;
}
-/* could check botDelay here to see if 459 status is advised */
-// puts("Content-Type:text/html");
-// puts("\n");
-
(void) hubPublicDbLoadAll();
-struct dbDb *dbList = ucscDbDb();
-char **ucscDbList = NULL;
-int listSize = slCount(dbList);
-AllocArray(ucscDbList, listSize);
-struct dbDb *el = dbList;
-int ucscDataBaseCount = 0;
-int maxDbNameWidth = 0;
-for ( ; el != NULL; el = el->next )
- {
- ucscDbList[ucscDataBaseCount++] = el->name;
- if (strlen(el->name) > maxDbNameWidth)
- maxDbNameWidth = strlen(el->name);
- }
-maxDbNameWidth += 1;
-
webStartJWest(cart, database, "UCSC JSON API interface");
// webStartGbNoBanner(cart, database, "UCSC JSON API interface");
// webStartGbOptionalBanner(cart, database, "UCSC JSON API interface", TRUE, FALSE);
hPrintf("\n");
if (debug)
{
hPrintf("
\n");
hPrintf("- hgBotDelay: %d
\n", botDelay);
char *envVar = getenv("BROWSER_HOST");
hPrintf("- BROWSER_HOST:%s
\n", envVar);
envVar = getenv("CONTEXT_DOCUMENT_ROOT");
hPrintf("- CONTEXT_DOCUMENT_ROOT:%s
\n", envVar);
envVar = getenv("CONTEXT_PREFIX");
@@ -1211,132 +1305,85 @@
hPrintf("- SCRIPT_NAME:%s
\n", envVar);
envVar = getenv("SCRIPT_URI");
hPrintf("- SCRIPT_URI:%s
\n", envVar);
envVar = getenv("SCRIPT_URL");
hPrintf("- SCRIPT_URL:%s
\n", envVar);
envVar = getenv("SERVER_NAME");
hPrintf("- SERVER_NAME:%s
\n", envVar);
envVar = getenv("PATH_INFO");
if (isNotEmpty(envVar))
hPrintf("- PATH_INFO:'%s'
\n", envVar);
else
hPrintf("- PATH_INFO:<empty>
\n");
hPrintf("
\n");
}
-char *goOtherHub = cartUsualString(cart, "goOtherHub", "");
-char *goUcscDb = cartUsualString(cart, "goUcscDb", "");
char *otherHubUrl = cartUsualString(cart, "urlHub", "");
-char *goPublicHub = cartUsualString(cart, "goPublicHub", "");
char *hubDropDown = cartUsualString(cart, "publicHubs", defaultHub);
char *urlDropDown = urlFromShortLabel(hubDropDown);
char *ucscDb = cartUsualString(cart, "ucscGenome", defaultDb);
+char *selectRadio = cartUsualString(cart, RADIO_GROUP, RADIO_PUBHUB);
char *urlInput = urlDropDown; /* assume public hub */
if (debug)
{
hPrintf("
\n");
- hPrintf("- goOtherHub: '%s'
\n", goOtherHub);
- hPrintf("- goUcscDb: '%s'
\n", goUcscDb);
hPrintf("- otherHubUrl: '%s'
\n", otherHubUrl);
- hPrintf("- goPublicHub: '%s'
\n", goPublicHub);
hPrintf("- hubDropDown: '%s'
\n", hubDropDown);
hPrintf("- urlDropDown: '%s'
\n", urlDropDown);
hPrintf("- ucscDb: '%s'
\n", ucscDb);
hPrintf("- urlInput: '%s'
\n", urlInput);
hPrintf("
\n");
}
-if (sameWord("go", goOtherHub)) /* requested other hub URL */
- urlInput = otherHubUrl;
-else if (isEmpty(otherHubUrl))
+if (isEmpty(otherHubUrl))
otherHubUrl = urlInput;
+if (sameWord(RADIO_OTHERHUB, selectRadio)) /* requested other hub URL */
+ urlInput = otherHubUrl;
+
if (commandError)
{
hPrintf("
ERROR: no such command: '%s/%s' for endpoint '%s'
", words[0], words[1], pathInfo);
}
long lastTime = clock1000();
struct trackHub *hub = errCatchTrackHubOpen(urlInput);
if (measureTiming || debug)
{
long thisTime = clock1000();
if (debug)
hPrintf("
hub open time: %ld millis\n", thisTime - lastTime);
}
hPrintf("
Please refer to API help documentation for more information about the JSON data API operation.
\n");
hPrintf("
\n");
if (debug)
showCartDump();
hPrintf("
Explore hub or database assemblies and tracks
\n");
+hPrintf("
Select one of these three sources, and display options:
\n");
-hPrintf("
\n");
+selectionForm();
hPrintf("
\n");
-if (sameWord("go", goUcscDb)) /* requested UCSC db track list */
+if (sameWord(RADIO_UCSCDB, selectRadio)) /* requested UCSC db track list */
{
tracksForUcscDb(ucscDb);
}
else
{
- hPrintf("
%s url: %s
\n", sameWord("go",goPublicHub) ? "Public hub" : "Other hub", urlInput);
+ hPrintf("
%s url: %s
\n", sameWord(RADIO_PUBHUB,selectRadio) ? "Public hub" : "Other hub", urlInput);
hPrintf("
\n");
hubInfo("hub name", hub->name);
hubInfo("short label", hub->shortLabel);
hubInfo("long label", hub->longLabel);
hubInfo("genomes file", hub->genomesFile);
hubInfo("default db", hub->defaultDb);
hubInfo("description url", hub->descriptionUrl);
hubInfo("email", hub->email);
if (debug)
{
hubInfo("version", hub->version); /* UCSC internal info */
hubInfo("level", hub->level); /* UCSC internal info */
}
hPrintf("
\n");
@@ -1346,31 +1393,31 @@
if (timedOut)
hPrintf("
Reached time out %ld seconds
", timeOutSeconds);
if (measureTiming || debug)
hPrintf("
Overall total time: %ld millis\n", clock1000() - enteredMainTime);
hPrintf("\n");
hPrintf("
\n");
webIncludeFile("inc/jWestFooter.html");
webEndJWest();
// cartWebEnd();
} /* void doMiddle(struct cart *theCart) */
/* Null terminated list of CGI Variables we don't want to save
* permanently. */
-static char *excludeVars[] = {"Submit", "submit", "goOtherHub", "goPublicHub", "goUcscDb", "ucscGenome", "publicHubs", "clade", NULL,};
+static char *excludeVars[] = {"Submit", "submit", "sourceSelected", "selectRadio", "ucscGenome", "publicHubs", "clade", NULL,};
int main(int argc, char *argv[])
/* Process command line. */
{
enteredMainTime = clock1000();
cgiSpoof(&argc, argv);
measureTiming = TRUE;
verboseTimeInit();
/* similar delay system as in DAS server */
botDelay = hgBotDelayTimeFrac(delayFraction);
if (botDelay > 0)
{
if (botDelay > 2000)
{
hogExit();