THRIFT-1314. cpp: add TProcessorFactory

Patch: Adam Simpkins

git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1164190 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cpp/src/server/TServer.h b/lib/cpp/src/server/TServer.h
index 4dddfea..6bd1398 100644
--- a/lib/cpp/src/server/TServer.h
+++ b/lib/cpp/src/server/TServer.h
@@ -112,8 +112,8 @@
     serve();
   }
 
-  boost::shared_ptr<TProcessor> getProcessor() {
-    return processor_;
+  boost::shared_ptr<TProcessorFactory> getProcessorFactory() {
+    return processorFactory_;
   }
 
   boost::shared_ptr<TServerTransport> getServerTransport() {
@@ -142,7 +142,7 @@
 
 protected:
   TServer(boost::shared_ptr<TProcessor> processor):
-    processor_(processor) {
+    processorFactory_(new TSingletonProcessorFactory(processor)) {
     setInputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
     setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
     setInputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
@@ -151,7 +151,7 @@
 
   TServer(boost::shared_ptr<TProcessor> processor,
           boost::shared_ptr<TServerTransport> serverTransport):
-    processor_(processor),
+    processorFactory_(new TSingletonProcessorFactory(processor)),
     serverTransport_(serverTransport) {
     setInputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
     setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
@@ -163,7 +163,7 @@
           boost::shared_ptr<TServerTransport> serverTransport,
           boost::shared_ptr<TTransportFactory> transportFactory,
           boost::shared_ptr<TProtocolFactory> protocolFactory):
-    processor_(processor),
+    processorFactory_(new TSingletonProcessorFactory(processor)),
     serverTransport_(serverTransport),
     inputTransportFactory_(transportFactory),
     outputTransportFactory_(transportFactory),
@@ -176,16 +176,33 @@
           boost::shared_ptr<TTransportFactory> outputTransportFactory,
           boost::shared_ptr<TProtocolFactory> inputProtocolFactory,
           boost::shared_ptr<TProtocolFactory> outputProtocolFactory):
-    processor_(processor),
+    processorFactory_(new TSingletonProcessorFactory(processor)),
     serverTransport_(serverTransport),
     inputTransportFactory_(inputTransportFactory),
     outputTransportFactory_(outputTransportFactory),
     inputProtocolFactory_(inputProtocolFactory),
     outputProtocolFactory_(outputProtocolFactory) {}
 
+  /**
+   * Get a TProcessor to handle calls on a particular connection.
+   *
+   * This method should only be called once per connection (never once per
+   * call).  This allows the TProcessorFactory to return a different processor
+   * for each connection if it desires.
+   */
+  boost::shared_ptr<TProcessor> getProcessor(
+      boost::shared_ptr<TProtocol> inputProtocol,
+      boost::shared_ptr<TProtocol> outputProtocol,
+      boost::shared_ptr<TTransport> transport) {
+    TConnectionInfo connInfo;
+    connInfo.input = inputProtocol;
+    connInfo.output = outputProtocol;
+    connInfo.transport = transport;
+    return processorFactory_->getProcessor(connInfo);
+  }
 
   // Class variables
-  boost::shared_ptr<TProcessor> processor_;
+  boost::shared_ptr<TProcessorFactory> processorFactory_;
   boost::shared_ptr<TServerTransport> serverTransport_;
 
   boost::shared_ptr<TTransportFactory> inputTransportFactory_;