Libclient is being refactored to accomodate the new org.apache.HttpClient 4.3.x behavior.

(Re)-design
-----------------

org.dataone.client.itk - new package for the high-level objects
    DataPackage
    D1Object
    D1Client

org.dataone.client  -  API for the service implementations, modeling composite service APIs 
    MNode                converted to interface
    CNode                converted to interface
                              *previously, CNode had extra methods to support getting a baseUrl from
                              a cached CN NodeList, in order to support new MNode(baseUrl) 
                              I hope to support these by interposing a ServiceLocator / NodeRegistry

org.dataone.client.rest - API for adapting Java methods to our defined REST / multipart API
    MultipartRestClient
    
org.dataone.client.impl.rest  - implementations of the MNode, CNode, andMultipartRestClient
    BaseD1Node  (non-public)
    RestClient (non-public)     (has-an HttpClient)
    MultipartMNode               extends BaseD1Node implements MNode
    MultipartCNode               extends BaseD1Node implements CNode
    HttpMultipartMNode         extends MultipartMNode
    HttpMultipartCNode          extends MultipartCNode
    HttpMultipartRestClient    implements MultipartRestClient;  (has-a RestClient)


Factories and maybe a ServiceLocator (since the registry behind cn.listNodes is akin to a ServiceLocator)  need to be written to allow dependency inversion, but for now, implementation would be:

/* set up the http elements that will be used by  multiple MNodes / CNodes */

HttpClient hc = HttpClients.createDefault();

int millisecs = 30000;
RequestConfig defaultTimeouts = RequestConfig.custom()
            .setConnectTimeout(millisecs)
            .setConnectionRequestTimeout(millisecs)
            .setSocketTimeout(millisecs).
            .build();


MultipartRestClient httpMrc = new HttpMultipartRestClient(hc, defaultTimeouts);

MNode mn1 = new HttpMultipartMNode(httpMrc, nodeBaseServiceUrl1);
MNode mn2 = new HttpMultipartMNode(httpMrc, nodeBaseServiceUrl2);
CNode cn = new HttpMultipartCNode(httpMrc, cnBaseUrl);

Settings.getConfiguration().setProperty("D1Client.D1Node.get.timeout",60000);  // could be set anytime prior to the get call.
mn1.get(...) // get some data, waiting up to 60 seconds
cn.get(...) // get some data, waiting up to 60 seconds

mn1.getSystemMetadata(...)  // get some systemMetadata, waiting up to 30 seconds
mn2.getSystemMetadata(...)  // get some systemMetadata, waiting up to 30 seconds


MNode mn3 = new MultipartMNode(httpMrc, baseUrl3);
mn3.get(...)  // get some data, no timeouts, same HttpClient (and ConnectionManager);

* I'm not completely satisfied with the timeout handling, but it preserves current behavior