Thrift generates a REST handler for PHP code


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664872 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_php_generator.cc b/compiler/cpp/src/generate/t_php_generator.cc
index 37c87f9..48e78da 100644
--- a/compiler/cpp/src/generate/t_php_generator.cc
+++ b/compiler/cpp/src/generate/t_php_generator.cc
@@ -395,6 +395,7 @@
 
   // Generate the three main parts of the service (well, two for now in PHP)
   generate_service_interface(tservice);
+  generate_service_rest(tservice);
   generate_service_client(tservice);
   generate_service_helpers(tservice);
   generate_service_processor(tservice);
@@ -673,6 +674,55 @@
 }
 
 /**
+ * Generates a REST interface
+ */
+void t_php_generator::generate_service_rest(t_service* tservice) {
+  string extends = "";
+  string extends_if = "";
+  if (tservice->get_extends() != NULL) {
+    extends = " extends " + tservice->get_extends()->get_name();
+    extends_if = " extends " + tservice->get_extends()->get_name() + "Rest";
+  }
+  f_service_ <<
+    "class " << service_name_ << "Rest" << extends_if << " implements " << service_name_ << "If {" << endl;
+  indent_up();
+  f_service_ <<
+    indent() << "var $impl_;" << endl <<
+    endl <<
+    indent() << "public function __construct($impl) {" << endl <<
+    indent() << "  $this->impl_ = $impl;" << endl <<
+    indent() << "}" << endl <<
+    endl;
+
+  vector<t_function*> functions = tservice->get_functions();
+  vector<t_function*>::iterator f_iter; 
+  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
+    indent(f_service_) <<
+      "public function " << (*f_iter)->get_name() << "($request) {" << endl;
+    indent_up();
+    const vector<t_field*>& args = (*f_iter)->get_arglist()->get_members();
+    vector<t_field*>::const_iterator a_iter;
+    for (a_iter = args.begin(); a_iter != args.end(); ++a_iter) {
+      f_service_ <<
+        indent() << "$" << (*a_iter)->get_name() << " = $request['" << (*a_iter)->get_name() << "'];" << endl;
+      if ((*a_iter)->get_type()->is_list()) {
+        f_service_ << 
+          indent() << "$" << (*a_iter)->get_name() << " = explode(',', $" << (*a_iter)->get_name() << ");" << endl;
+      }      
+    }
+    f_service_ <<
+      indent() << "return $this->impl_->" << (*f_iter)->get_name() << "(" << argument_list((*f_iter)->get_arglist()) << ");" << endl;
+    indent_down();
+    indent(f_service_) <<
+      "}" << endl <<
+      endl;
+  }
+  indent_down();
+  f_service_ <<
+    "}" << endl << endl; 
+}
+
+/**
  * Generates a service client definition.
  *
  * @param tservice The service to generate a server for.
diff --git a/compiler/cpp/src/generate/t_php_generator.h b/compiler/cpp/src/generate/t_php_generator.h
index 609cbae..e74321d 100644
--- a/compiler/cpp/src/generate/t_php_generator.h
+++ b/compiler/cpp/src/generate/t_php_generator.h
@@ -58,6 +58,7 @@
 
   void generate_service_helpers   (t_service* tservice);
   void generate_service_interface (t_service* tservice);
+  void generate_service_rest      (t_service* tservice);
   void generate_service_client    (t_service* tservice);
   void generate_service_processor (t_service* tservice);
   void generate_process_function  (t_service* tservice, t_function* tfunction);