NetKernel News Volume 3 Issue 5

November 25th 2011

What's new this week?

Catch up on last week's news here

Repository Updates

The following NetKernel 5.1.1 updates are available in the NKSE and NKEE repositories...

  • kernel 1.22.1
    • Added support for new HEADER_EXCLUDE_DEPENDENCIES (see below)
    • Added detection of a self-deadlocked non-thread-safe endpoint (see below)
  • lang-ncode 1.7.1
    • Added While and Until endpoints - kindly contributed by Tom Geudens.
  • layer0 1.76.1
    • Updated to reflect kernel updates
  • nkse-dev-tools 1.42.1
    • Fixed CSS so that Space Explorer and Visualizer now look consistent in Safari/Chrome on OSX
  • nkse-doc-content 1.40.1
  • xml-core 2.3.1
    • Added a new active:xpath1 endpoint - kindly contributed by Tom Geudens.

Kernel Updates: HEADER_EXCLUDE_DEPENDENCIES / Thread-Safe Deadlock Detection

Sometimes the requestor of a resource might want to impose their own decision about the cacheability of the resulting response. For example, suppose you make an HTTP request to a POST service - but rather than being always expired, you might like to hold on to the response for a period of time?

This scenario recently came up for Glenn Proctor (as discussed on the forum) and others also then described that this was a pattern they also experienced. There were various discussions of ways to implement an intermediate layer to decouple the mixing of the expired resource into the dependency model of a higher order resource.

This was all a bit fiddly. So this week we've added a simple update to the kernel to support the HEADER_EXCLUDE_DEPENDENCIES header. This header, when set on an issued request, causes the kernel to exclude any subsequent expiry determinants from the set of expiries being accumulated for the requesting endpoint.

INKFRequest request = context.createRequest(...);
request.setHeader(INKFRequest.HEADER_EXCLUDE_DEPENDENCIES, true);

The requesting endpoint may now issue its response and those requests which had excluded dependencies will no longer mix in to the expiration determinants of the response. The net effect is that the requestor can provide an expiration dependency "glass-ceiling" above which its semantics for expiry become definitive.

Thread-Safe Deadlock Detection

Back in September I explained how the thread-safe declaration of an endpoint can accidentally result in a recursive indirect deadlock.

With today's update, the kernel now implements a self-deadlock detection feature such that if an endpoint is currently executing a request and the same thread that was issued into that endpoint re-entrantly tries to request the same endpoint (an extrinsic recursion) then an exception is thrown, which should take care of accidental issues for undeclared threadsafe endpoints.

New: active:xpath, nCoDE - while/until endpoints

Tom Geudens has kindly contributed some useful tools that have been released into the repos this week.


Firstly, the xml-core library adds a new utility tool for slicing and dicing XML based upon XPath 1.0 expressions. It implements the same features as the xml-saxon active:xpath2 tool but for the original XPath 1.0 feature set.

Here's the documentation...

When a request with the SOURCE verb is issued to active:xpath the XPath expression specified in the required operator argument is used against the XML document specified in the required operand argument.

The operator argument specifies the XPath 1.0 expression and must be transreptable to a IDeterminateString.


The returned representation depends on the XPath expression. For example:

  • "boolean(/xpath)" returns a java.lang.Boolean
  • "string(/xpath)" returns a java.lang.String
  • "/xpath" returns an org.w3c.dom.Document (DOM Document). The root of the document will be a node named resultset and each resultant fragment will be appended as a child.

See the optional xml-saxon module for XPath 2.0 support.

nCoDE while/until

Secondly, in lang-nCoDE there are two new built-in endpoints - providing support for While and Until loops. The components appear in the "Built-in" palette and look like this...

The condition is sourced as a Boolean for each do of the loop (either prior or post the do respectively). The tolerant argument indicates whether to tolerate exceptions in the do process.

These contributions nicely demonstrate what I discussed, last week - that DPML is a language with no functions - both of these "functions" are just endpoints which are now included in the lang-ncode module. If you wished you could use them as standalone services just by importing lang-ncode as a service library.

RESTOverlay Available for Review

As initially discussed last week, we've implemented a new RESTOverlay. It is a companion to the HTTPBridge and performs the role of a dynamic router, selecting a target endpoint based upon the HTTP-client's preferences and the declared REST capabilities of the targets, expressed as user-defined metadata.

An overview of the architecture is shown below...

The blue boxes show some example fields for the rest metadata. In this example, the endpoints are differentiated by the HTTP method, while both are candidates for the same logical resource (res:/basepath/foo) since they have the same simple grammar declaration foo.

The RESTOverlay implements the following features...

  • Full simple grammars with pass-through arguments to targeted endpoint
  • HTTP method/verb routing
  • dynamic content negotiation using client's Accept header
  • Body mimetype target selection on entity bearing methods.
  • dynamic language-based content negotiation
  • Bounce to SSL if the endpoint says it must be trusted connection.
  • Dynamic negotiated compression based on client capabilities (gzip, deflate).

The RESTOverlay takes a and an optional tag as its config. By default the routing algorithm is tolerant and will always find a target endpoint even if the parameters are not strictly matched. Strict mode will fail with a 406 response code if an exact match to the client's specified requirement cannot be determined.

An configuration option causes the RESTOverlay to create a catch-all 404 handler endpoint as the endpoint of last resort which has a catch-all grammar rooted at the basepath. If it is resolved it sets the necessary 404 response code.

If the managed target endpoints have ambiguous grammars the RESTOverlay will incidate that it is not correctly configured. You will have to find the reported endpoint and ensure that it has a unique grammar so that the RESTOverlay is able to unambiguously relay a request to it.

The RESTOverlay is semi-transparent. If its' wrapped space contains endpoints which do not have metadata suitable for the RESTOverlay (ie no meta/rest/ declaration) then they are transparently relayed through the overlay as though it were not there. This allows you to freely mix managed-REST and non-REST endpoints in the wrapped space as required.


We've posted a new version of tpt:http module incorporating a preview of the RESTOverlay here...

the tests are here...


The download jar is a module and it directly replaces the existing tpt:http module that comes with NK. To try it out, in modules.xml, comment out the current one and add a reference to the new one. In lieu of detailed docs, the unit test module is self-contained and provides full coverage of the capabilities so far.


The adaptive routing algorithm that we've devised does a sorted-sift of the candidate target endpoints. It maintains priority order based upon the client-side weighting preferences (Accept, Accept-Language, Accept-Encoding etc).

The Overlay is dynamically configured and automatically reflects changes if you add endpoints, change metadata etc etc. Configuration change happens out-of-band and thereafter the operating set is semi-static. The net result is that the overlay is really light-weight. After repeatedly running the tests I'm seeing an average response time of just 0.12ms - so effectively the RESTOverlay has negligable cost.

All resources which can be cached inside the target space will be cached as normal. When an http request comes in then an eTag will be set and if re-requested and it's still cached a 304 response is issued. (This is just the usual HTTPBridge behaviour - all the RESTOverlay does is make sure the caching boundary of the app is consistent).


The core features of the tool are now pretty much done and are solid. Give it a go - let us know how you get on.

Still To Come

  • User supplied 404 and 406 endpoints to allow the user app to supply handlers for these error conditions.
  • User supplied pre/post-process endpoint target - for arbitrary pre/post-process handling.
  • User supplied exception handler endpoint target
  • MD5/SHA1 eTag hashcode generation.

Have a great weekend,


Please feel free to comment on the NetKernel Forum

Follow on Twitter:

@pjr1060 for day-to-day NK/ROC updates
@netkernel for announcements
@tab1060 for the hard-core stuff

To subscribe for news and alerts

Join the NetKernel Portal to get news, announcements and extra features.

NetKernel will ROC your world

Download now
NetKernel, ROC, Resource Oriented Computing are registered trademarks of 1060 Research

© 2008-2011, 1060 Research Limited