Home > Articles

State of the Nation

All Legs, No Brains

Unfortunately, we still aren't at the end of our journey to find out how the proper BTB HTML is pulled from the database. While the above function does the legwork, the brains behind the operation lie within the stateid variable. Sigh. Let's backtrack a little to see how stateid gets assigned a value.

Included in each and every ASP page on the site is the file State.asp. Before anything else happens, State.asp tries to figure out where you are. It first checks whether you're at /index.asp, the home page. If not, it then checks the query string for the n and t arguments. These stand for navigation ID and tab navigation ID, respectively. These two values, if found in the query string, can uniquely determine the state of the page, and demonstrate that State.asp has previously passed through and left tracks. If State finds that you're accessing the home page, default values of n and t are assigned, and the page can load.

If you're not on the home page and n and t are not found in the query string, State.asp checks for the product_id argument. product_id is a unique identifier that we assign to every article, sample chapter, book, etc. on the site. Remember in the last article when I mentioned the taxonomy, our system of tagging each piece of content with a descriptive label or labels? Here's where that ties into the BTB, if in a roundabout way.

The word taxonomy generally denotes a system of classification. Let's use an article about Perl programming as an example. In the InformIT taxonomy, this article will probably get tagged as topic Programming and subtopic Perl. Looking at Figure 2, you'll see that this matches up nicely in the BTB.

Figure 2 The BTB points to Programming/Perl.

This same article, depending on its exact content, may also be tagged with other descriptors. It may be about using Perl on web pages, so it might get further tagged with Web Development and Perl. In fact, the taxonomy reference dimension, as we call it, is actually five levels deep. We could tag something Programming - Perl - TCP\IP - Sockets - Logic. In general, we don't bother, but why not have the horsepower under the hood?

All right, so here we have this article tagged Programming - Perl. Let's say that we've clicked a home page link, because this is a brand spanking-new article, and we have traveled directly to the first page of "I Was a Teenage Perl Hacker." State.asp checks whether we're on the home page. Nope. We just left there. Are the n and t arguments available? Nope. That leaves us with the product_id.

To actually display an article (or any content), the product_id is a vital piece of information. No piece of content is ever displayed without a product_id in the query string. Therefore State.asp has something to work with. State.asp calls a routine named getNavigationidsFromProductid (whew, that's a mouthful).

1 public String[ ] getNavigationidsFromProductid (String product_id)
2 {
3   String[ ] ret = {null,null};
4
5   if (com.informit.shared.FormatParser.isGUID (product_id)
6       == true) {
7   return ( StateDB.getNavigationidsFromProductid
8     ( product_id ) );
9   }
10   else {
11   return ret;
12  }
13
14 }

Which, after checking for a valid product_id, calls the StateDB class method:

1 public static String[ ] getNavigationidsFromProductid(String pid)
2 {
3   String[ ] tmp = {null,null};
4
5   StoredProcedure mysp = new StoredProcedure();
6   mysp.appendParam("@prodid",
7       AdoEnums.DataType.GUID,
8       AdoEnums.ParameterDirection.INPUT,
9       50,
10       pid);
11  mysp.appendParam("@navid",
12       AdoEnums.DataType.GUID,
13       AdoEnums.ParameterDirection.OUTPUT,
14       50,
15       null );
16  mysp.appendParam("@tabid",
17       AdoEnums.DataType.GUID,
18       AdoEnums.ParameterDirection.OUTPUT,
19       50,
20       null );
21  mysp.executeStandard(Database.dsn(),
22     "sp_state_get_navigationids_from_productid");
23  tmp[0] = mysp.Parameters.getItem("@navid").getString();
24  tmp[1] = mysp.Parameters.getItem("@tabid").getString();
25
26  return tmp;
27 }

Voilà! We now have a navigation ID and tab navigation ID passed back in a Java string array. One other function call and the state ID is uniquely determined. Once we have state, we have an arrow pointed directly at the proper BTB HTML.

Okay, you've caught me again. You might have noticed that this Java call doesn't actually do any "thinking." There are no references to the taxonomy values, and no mention of the product ID, other than to pass it along to the stored procedure, sp_state_get_navigationids_from_productid. But just as I have to simmer after a bad foosball loss, you'll have to wait in frustration for the next installment, where I dig into the SQL guts of the BTB logic.

In my next article, I promise to cross every t and put a big smiley face over each i and show how taxonomy is tied to product is tied to state is tied to the BTB. It will be just like the end of a Scooby Doo mystery, where we find out that it was old Mr. McFeeley, the gardener, all along. We would have gotten away with it, too, if it weren't for those meddling kids.

InformIT Promotional Mailings & Special Offers

I would like to receive exclusive offers and hear about products from InformIT and its family of brands. I can unsubscribe at any time.