You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by bu...@apache.org on 2014/03/20 05:04:27 UTC

svn commit: r902469 - in /websites/staging/thrift/trunk/content: ./ index.html

Author: buildbot
Date: Thu Mar 20 04:04:27 2014
New Revision: 902469

Log:
Staging update by buildbot for thrift

Modified:
    websites/staging/thrift/trunk/content/   (props changed)
    websites/staging/thrift/trunk/content/index.html

Propchange: websites/staging/thrift/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Thu Mar 20 04:04:27 2014
@@ -1 +1 @@
-1579525
+1579529

Modified: websites/staging/thrift/trunk/content/index.html
==============================================================================
--- websites/staging/thrift/trunk/content/index.html (original)
+++ websites/staging/thrift/trunk/content/index.html Thu Mar 20 04:04:27 2014
@@ -139,13 +139,356 @@
   </ul>
   <div class="tab-content">
     <div class="tab-pane active" id="1">
-      [snippet:path=tutorial/tutorial.thrift:lang=text:token=SNIPPET]
+          :::text
+    /*
+     * 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
+     * &quot;License&quot;); 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
+     * &quot;AS IS&quot; 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.
+     */
+
+    # Thrift Tutorial
+    # Mark Slee (mcslee@facebook.com)
+    #
+    # This file aims to teach you how to use Thrift, in a .thrift file. Neato. The
+    # first thing to notice is that .thrift files support standard shell comments.
+    # This lets you make your thrift file executable and include your Thrift build
+    # step on the top line. And you can place comments like this anywhere you like.
+    #
+    # Before running this file, you will need to have installed the thrift compiler
+    # into /usr/local/bin.
+
+    /**
+     * The first thing to know about are types. The available types in Thrift are:
+     *
+     *  bool        Boolean, one byte
+     *  byte        Signed byte
+     *  i16         Signed 16-bit integer
+     *  i32         Signed 32-bit integer
+     *  i64         Signed 64-bit integer
+     *  double      64-bit floating point value
+     *  string      String
+     *  binary      Blob (byte array)
+     *  map&lt;t1,t2&gt;  Map from one type to another
+     *  list&lt;t1&gt;    Ordered list of one type
+     *  set&lt;t1&gt;     Set of unique elements of one type
+     *
+     * Did you also notice that Thrift supports C style comments?
+     */
+
+    // Just in case you were wondering... yes. We support simple C comments too.
+
+    /**
+     * Thrift files can reference other Thrift files to include common struct
+     * and service definitions. These are found using the current path, or by
+     * searching relative to any paths specified with the -I compiler flag.
+     *
+     * Included objects are accessed using the name of the .thrift file as a
+     * prefix. i.e. shared.SharedObject
+     */
+    include &quot;shared.thrift&quot;
+
+    /**
+     * Thrift files can namespace, package, or prefix their output in various
+     * target languages.
+     */
+    namespace cpp tutorial
+    namespace d tutorial
+    namespace java tutorial
+    namespace php tutorial
+    namespace perl tutorial
+
+    /**
+     * Thrift lets you do typedefs to get pretty names for your types. Standard
+     * C style here.
+     */
+    typedef i32 MyInteger
+
+    /**
+     * Thrift also lets you define constants for use across languages. Complex
+     * types and structs are specified using JSON notation.
+     */
+    const i32 INT32CONSTANT = 9853
+    const map&lt;string,string&gt; MAPCONSTANT = {&#39;hello&#39;:&#39;world&#39;, &#39;goodnight&#39;:&#39;moon&#39;}
+
+    /**
+     * You can define enums, which are just 32 bit integers. Values are optional
+     * and start at 1 if not supplied, C style again.
+     */
+    enum Operation {
+      ADD = 1,
+      SUBTRACT = 2,
+      MULTIPLY = 3,
+      DIVIDE = 4
+    }
+
+    /**
+     * Structs are the basic complex data structures. They are comprised of fields
+     * which each have an integer identifier, a type, a symbolic name, and an
+     * optional default value.
+     *
+     * Fields can be declared &quot;optional&quot;, which ensures they will not be included
+     * in the serialized output if they aren&#39;t set.  Note that this requires some
+     * manual management in some languages.
+     */
+    struct Work {
+      1: i32 num1 = 0,
+      2: i32 num2,
+      3: Operation op,
+      4: optional string comment,
+    }
+
+    /**
+     * Structs can also be exceptions, if they are nasty.
+     */
+    exception InvalidOperation {
+      1: i32 what,
+      2: string why
+    }
+
+    /**
+     * Ahh, now onto the cool part, defining a service. Services just need a name
+     * and can optionally inherit from another service using the extends keyword.
+     */
+    service Calculator extends shared.SharedService {
+
+      /**
+       * A method definition looks like C code. It has a return type, arguments,
+       * and optionally a list of exceptions that it may throw. Note that argument
+       * lists and exception lists are specified using the exact same syntax as
+       * field lists in struct or exception definitions.
+       */
+
+       void ping(),
+
+       i32 add(1:i32 num1, 2:i32 num2),
+
+       i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
+
+       /**
+        * This method has a oneway modifier. That means the client only makes
+        * a request and does not listen for any response at all. Oneway methods
+        * must be void.
+        */
+       oneway void zip()
+
+    }
+
+    /**
+     * That just about covers the basics. Take a look in the test/ folder for more
+     * detailed examples. After you run this file, your generated code shows up
+     * in folders with names gen-&lt;language&gt;. The generated code isn&#39;t too scary
+     * to look at. It even has pretty indentation.
+     */
+
     </div>
     <div class="tab-pane" id="2">
-      [snippet:path=tutorial/py/PythonClient.py:lang=python:token=SNIPPET]
+          :::python
+    #!/usr/bin/env python
+
+    #
+    # 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
+    # &quot;License&quot;); 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
+    # &quot;AS IS&quot; 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.
+    #
+
+    import sys, glob
+    sys.path.append(&#39;gen-py&#39;)
+    sys.path.insert(0, glob.glob(&#39;../../lib/py/build/lib.*&#39;)[0])
+
+    from tutorial import Calculator
+    from tutorial.ttypes import *
+
+    from thrift import Thrift
+    from thrift.transport import TSocket
+    from thrift.transport import TTransport
+    from thrift.protocol import TBinaryProtocol
+
+    try:
+
+      # Make socket
+      transport = TSocket.TSocket(&#39;localhost&#39;, 9090)
+
+      # Buffering is critical. Raw sockets are very slow
+      transport = TTransport.TBufferedTransport(transport)
+
+      # Wrap in a protocol
+      protocol = TBinaryProtocol.TBinaryProtocol(transport)
+
+      # Create a client to use the protocol encoder
+      client = Calculator.Client(protocol)
+
+      # Connect!
+      transport.open()
+
+      client.ping()
+      print &#39;ping()&#39;
+
+      sum = client.add(1,1)
+      print &#39;1+1=%d&#39; % (sum)
+
+      work = Work()
+
+      work.op = Operation.DIVIDE
+      work.num1 = 1
+      work.num2 = 0
+
+      try:
+        quotient = client.calculate(1, work)
+        print &#39;Whoa? You know how to divide by zero?&#39;
+      except InvalidOperation, io:
+        print &#39;InvalidOperation: %r&#39; % io
+
+      work.op = Operation.SUBTRACT
+      work.num1 = 15
+      work.num2 = 10
+
+      diff = client.calculate(1, work)
+      print &#39;15-10=%d&#39; % (diff)
+
+      log = client.getStruct(1)
+      print &#39;Check log: %s&#39; % (log.value)
+
+      # Close!
+      transport.close()
+
+    except Thrift.TException, tx:
+      print &#39;%s&#39; % (tx
     </div>
     <div class="tab-pane" id="3">
-      [snippet:path=tutorial/java/src/JavaServer.java:lang=java:token=SNIPPET]
+          :::java
+    /*
+     * 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
+     * &quot;License&quot;); 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
+     * &quot;AS IS&quot; 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.
+     */
+
+    import org.apache.thrift.server.TServer;
+    import org.apache.thrift.server.TServer.Args;
+    import org.apache.thrift.server.TSimpleServer;
+    import org.apache.thrift.server.TThreadPoolServer;
+    import org.apache.thrift.transport.TSSLTransportFactory;
+    import org.apache.thrift.transport.TServerSocket;
+    import org.apache.thrift.transport.TServerTransport;
+    import org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters;
+
+    // Generated code
+    import tutorial.*;
+    import shared.*;
+
+    import java.util.HashMap;
+
+    public class JavaServer {
+
+      public static CalculatorHandler handler;
+
+      public static Calculator.Processor processor;
+
+      public static void main(String [] args) {
+        try {
+          handler = new CalculatorHandler();
+          processor = new Calculator.Processor(handler);
+
+          Runnable simple = new Runnable() {
+            public void run() {
+              simple(processor);
+            }
+          };      
+          Runnable secure = new Runnable() {
+            public void run() {
+              secure(processor);
+            }
+          };
+
+          new Thread(simple).start();
+          new Thread(secure).start();
+        } catch (Exception x) {
+          x.printStackTrace();
+        }
+      }
+
+      public static void simple(Calculator.Processor processor) {
+        try {
+          TServerTransport serverTransport = new TServerSocket(9090);
+          TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
+
+          // Use this for a multithreaded server
+          // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
+
+          System.out.println(&quot;Starting the simple server...&quot;);
+          server.serve();
+        } catch (Exception e) {
+          e.printStackTrace();
+        }
+      }
+
+      public static void secure(Calculator.Processor processor) {
+        try {
+          /*
+           * Use TSSLTransportParameters to setup the required SSL parameters. In this example
+           * we are setting the keystore and the keystore password. Other things like algorithms,
+           * cipher suites, client auth etc can be set. 
+           */
+          TSSLTransportParameters params = new TSSLTransportParameters();
+          // The Keystore contains the private key
+          params.setKeyStore(&quot;../../lib/java/test/.keystore&quot;, &quot;thrift&quot;, null, null);
+
+          /*
+           * Use any of the TSSLTransportFactory to get a server transport with the appropriate
+           * SSL configuration. You can use the default settings if properties are set in the command line.
+           * Ex: -Djavax.net.ssl.keyStore=.keystore and -Djavax.net.ssl.keyStorePassword=thrift
+           * 
+           * Note: You need not explicitly call open(). The underlying server socket is bound on return
+           * from the factory class. 
+           */
+          TServerTransport serverTransport = TSSLTransportFactory.getServerSocket(9091, 0, null, params);
+          TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
+
+          // Use this for a multi threaded server
+          // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
+
+          System.out.println(&quot;Starting the secure server...&quot;);
+          server.serve();
+        } catch (Exception e) {
+          e
     </div>
   </div>
 </div>