You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by jk...@apache.org on 2017/02/18 18:59:24 UTC

thrift git commit: THRIFT-2504: Add default processor to java multiplexed processor to handle older clients Client: Java

Repository: thrift
Updated Branches:
  refs/heads/master 736075d2a -> 400b346db


THRIFT-2504: Add default processor to java multiplexed processor to handle older clients
Client: Java

This closes #114
This closes #1195


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/400b346d
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/400b346d
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/400b346d

Branch: refs/heads/master
Commit: 400b346db2510fffa06c0ced11105e3618ce5367
Parents: 736075d
Author: Aleksey Pesternikov <ap...@alekseys-mbp.att.net>
Authored: Thu May 1 13:58:18 2014 -0700
Committer: James E. King, III <jk...@apache.org>
Committed: Sat Feb 18 13:58:21 2017 -0500

----------------------------------------------------------------------
 lib/java/build.xml                              |  1 +
 .../apache/thrift/TMultiplexedProcessor.java    | 17 +++-
 .../apache/thrift/TestMultiplexedProcessor.java | 86 ++++++++++++++++++++
 3 files changed, 101 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/400b346d/lib/java/build.xml
----------------------------------------------------------------------
diff --git a/lib/java/build.xml b/lib/java/build.xml
index 40cd4f6..6af9f27 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -372,6 +372,7 @@
     <artifact:dependencies filesetId="test-dependency-jars" useScope="runtime">
       <dependency groupId="org.slf4j" artifactId="slf4j-log4j12" version="${slf4j.version}"/>
       <dependency groupId="junit" artifactId="junit" version="4.4"/>
+      <dependency groupId="org.mockito" artifactId="mockito-all" version="1.9.5"/>
     </artifact:dependencies>
 
     <!-- Copy the test dependencies to the build/lib dir -->

http://git-wip-us.apache.org/repos/asf/thrift/blob/400b346d/lib/java/src/org/apache/thrift/TMultiplexedProcessor.java
----------------------------------------------------------------------
diff --git a/lib/java/src/org/apache/thrift/TMultiplexedProcessor.java b/lib/java/src/org/apache/thrift/TMultiplexedProcessor.java
index f6547ac..d0c5603 100644
--- a/lib/java/src/org/apache/thrift/TMultiplexedProcessor.java
+++ b/lib/java/src/org/apache/thrift/TMultiplexedProcessor.java
@@ -52,6 +52,7 @@ public class TMultiplexedProcessor implements TProcessor {
 
     private final Map<String,TProcessor> SERVICE_PROCESSOR_MAP
             = new HashMap<String,TProcessor>();
+    private TProcessor defaultProcessor;
 
     /**
      * 'Register' a service with this <code>TMultiplexedProcessor</code>.  This
@@ -68,6 +69,14 @@ public class TMultiplexedProcessor implements TProcessor {
     }
 
     /**
+     * Register a service to be called to process queries without service name
+     * @param processor
+     */
+    public void registerDefault(TProcessor processor) {
+        defaultProcessor = processor;
+    }
+
+    /**
      * This implementation of <code>process</code> performs the following steps:
      *
      * <ol>
@@ -77,7 +86,7 @@ public class TMultiplexedProcessor implements TProcessor {
      *     <li>Dispatch to the processor, with a decorated instance of TProtocol
      *         that allows readMessageBegin() to return the original TMessage.</li>
      * </ol>
-     *  
+     *
      * @throws TException If the message type is not CALL or ONEWAY, if
      * the service name was not found in the message, or if the service
      * name was not found in the service map.  You called {@link #registerProcessor(String, TProcessor) registerProcessor}
@@ -92,14 +101,16 @@ public class TMultiplexedProcessor implements TProcessor {
         TMessage message = iprot.readMessageBegin();
 
         if (message.type != TMessageType.CALL && message.type != TMessageType.ONEWAY) {
-            // TODO Apache Guys - Can the server ever get an EXCEPTION or REPLY?
-            // TODO Should we check for this here?
             throw new TException("This should not have happened!?");
         }
 
         // Extract the service name
         int index = message.name.indexOf(TMultiplexedProtocol.SEPARATOR);
         if (index < 0) {
+          if (defaultProcessor != null) {
+                // Dispatch processing to the stored processor
+                return defaultProcessor.process(new StoredMessageProtocol(iprot, message), oprot);
+          }
             throw new TException("Service name not found in message name: " + message.name + ".  Did you " +
                     "forget to use a TMultiplexProtocol in your client?");
         }

http://git-wip-us.apache.org/repos/asf/thrift/blob/400b346d/lib/java/test/org/apache/thrift/TestMultiplexedProcessor.java
----------------------------------------------------------------------
diff --git a/lib/java/test/org/apache/thrift/TestMultiplexedProcessor.java b/lib/java/test/org/apache/thrift/TestMultiplexedProcessor.java
new file mode 100644
index 0000000..01776ca
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/TestMultiplexedProcessor.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.thrift;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.thrift.protocol.TMessage;
+import org.apache.thrift.protocol.TMessageType;
+import org.apache.thrift.protocol.TProtocol;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestMultiplexedProcessor {
+  private TMultiplexedProcessor mp;
+  private TProtocol iprot;
+  private TProtocol oprot;
+
+  @Before
+  public void setUp() throws Exception {
+    mp = new TMultiplexedProcessor();
+    iprot = mock(TProtocol.class);
+    oprot = mock(TProtocol.class);
+  }
+
+  @Test(expected = TException.class)
+  public void testWrongMessageType() throws TException {
+    when (iprot.readMessageBegin()).thenReturn(new TMessage("service:func", TMessageType.REPLY, 42));
+    mp.process(iprot, oprot);
+  }
+
+  @Test(expected = TException.class)
+  public void testNoSuchService() throws TException {
+    when(iprot.readMessageBegin()).thenReturn(new TMessage("service:func", TMessageType.CALL, 42));
+
+    mp.process(iprot, oprot);
+  }
+
+  static class StubProcessor implements TProcessor {
+    @Override
+    public boolean process(TProtocol in, TProtocol out) throws TException {
+      TMessage msg = in.readMessageBegin();
+      if (!"func".equals(msg.name) || msg.type!=TMessageType.CALL || msg.seqid!=42) {
+        throw new TException("incorrect parameters");
+      }
+      out.writeMessageBegin(new TMessage("func", TMessageType.REPLY, 42));
+      return true;
+    }
+  }
+
+  @Test
+  public void testExistingService() throws TException {
+    when(iprot.readMessageBegin()).thenReturn(new TMessage("service:func", TMessageType.CALL, 42));
+    mp.registerProcessor("service", new StubProcessor());
+    mp.process(iprot, oprot);
+    verify(oprot).writeMessageBegin(any(TMessage.class));
+  }
+
+  @Test
+  public void testDefaultService() throws TException {
+    when(iprot.readMessageBegin()).thenReturn(new TMessage("func", TMessageType.CALL, 42));
+    mp.registerDefault(new StubProcessor());
+    mp.process(iprot, oprot);
+    verify(oprot).writeMessageBegin(any(TMessage.class));
+  }
+
+}