You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by wa...@apache.org on 2019/12/11 14:39:40 UTC

[dubbo-php-framework] 26/31: add Automatic identification of parameter types

This is an automated email from the ASF dual-hosted git repository.

wangxin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-php-framework.git

commit 56045c060c25faf206de0be47ed1ae57b970c7f2
Author: wangjinxi <wa...@che001.com>
AuthorDate: Wed Jul 24 16:26:50 2019 +0800

    add Automatic identification of parameter types
---
 common/protocol/fsof/DubboParser.php  |   4 +-
 common/protocol/fsof/DubboRequest.php |  12 +-
 consumer/Type.php                     | 228 +++++++++-------------------------
 consumer/proxy/Proxy.php              |  13 +-
 4 files changed, 75 insertions(+), 182 deletions(-)

diff --git a/common/protocol/fsof/DubboParser.php b/common/protocol/fsof/DubboParser.php
index 921e912..0497f5f 100644
--- a/common/protocol/fsof/DubboParser.php
+++ b/common/protocol/fsof/DubboParser.php
@@ -106,7 +106,7 @@ class DubboParser
         }
         $reqData .= json_encode($request->getMethod()) . PHP_EOL;
         $reqData .= json_encode($this->typeRefs($request)) . PHP_EOL;
-        foreach (Type::getDataForSafed($request->getParams()) as $value) {
+        foreach ($request->getParams() as $value) {
             $reqData .= json_encode($value) . PHP_EOL;
         }
         $attach = array();
@@ -138,7 +138,7 @@ class DubboParser
         }
         $reqData .= $encode->encode($request->getMethod());
         $reqData .= $encode->encode($this->typeRefs($request));
-        foreach (Type::getDataForSafed($request->getParams()) as $value) {
+        foreach ($request->getParams() as $value) {
             $reqData .= $encode->encode($value);
         }
         $attach = ['path' => $request->getService(), 'interface' => $request->getService(), 'timeout' => $request->getTimeout()];
diff --git a/common/protocol/fsof/DubboRequest.php b/common/protocol/fsof/DubboRequest.php
index cb30cb7..8ec2c8e 100644
--- a/common/protocol/fsof/DubboRequest.php
+++ b/common/protocol/fsof/DubboRequest.php
@@ -17,6 +17,8 @@
  */
 namespace com\fenqile\fsof\common\protocol\fsof;
 
+use com\fenqile\fsof\consumer\Type;
+
 class DubboRequest
 {
     //包头字段
@@ -89,7 +91,6 @@ class DubboRequest
     }
 
 
-
     /**
      * @return boolean
      */
@@ -107,8 +108,6 @@ class DubboRequest
     }
 
 
-
-
     /**
      * @return mixed
      */
@@ -142,7 +141,6 @@ class DubboRequest
     }
 
 
-
     /**
      * @return mixed
      */
@@ -269,6 +267,11 @@ class DubboRequest
     public function setParams($params)
     {
         $this->params = $params;
+        foreach ($this->params as &$val) {
+            if ($val instanceof Type) {
+                $val = $val->object;
+            }
+        }
     }
 
     /**
@@ -320,7 +323,6 @@ class DubboRequest
     }
 
 
-
     //用于监控service中各方法的性能
     public $startTime;            //开始处理请求的时间
     public $endTime;            //请求处理结束的时间
diff --git a/consumer/Type.php b/consumer/Type.php
index 673d507..20c8123 100644
--- a/consumer/Type.php
+++ b/consumer/Type.php
@@ -2,8 +2,12 @@
 
 namespace com\fenqile\fsof\consumer;
 
+use com\fenqile\fsof\consumer\ConsumerException;
+use Icecave\Collections\Collection;
+
 class Type
 {
+    /*
     const SHORT = 1;
     const INT = 2;
     const INTEGER = 2;
@@ -13,10 +17,13 @@ class Type
     const STRING = 6;
     const BOOL = 7;
     const BOOLEAN = 7;
-    const ARRAYLIST = 8;
-    const MAP = 9;
+    const MAP = 8;
+    */
+    const ARRAYLIST = 9;
+    const DEFAULT_TYPE = 10;
 
     const adapter = [
+        /*
         Type::SHORT => 'S',
         Type::INT => 'I',
         Type::LONG => 'J',
@@ -24,193 +31,82 @@ class Type
         Type::DOUBLE => 'D',
         Type::BOOLEAN => 'Z',
         Type::STRING => 'Ljava/lang/String;',
+        Type::MAP => 'Ljava/util/Map;',
+        */
         Type::ARRAYLIST => 'Ljava/util/ArrayList;',
-        Type::MAP => 'Ljava/util/Map;'
+        Type::DEFAULT_TYPE => 'Ljava/lang/Object;'
     ];
 
-    public function __construct($type, $value)
-    {
-        $this->type = $type;
-        $this->value = $value;
-    }
-
-    /**
-     * Short type
-     *
-     * @param  integer $value
-     * @return Type
-     */
-    public static function short($value)
-    {
-        return new self(self::SHORT, $value);
-    }
-
-    /**
-     * Int type
-     *
-     * @param  integer $value
-     * @return Type
-     */
-    public static function int($value)
-    {
-        return new self(self::INT, $value);
-    }
-
-    /**
-     * Integer type
-     *
-     * @param  integer $value
-     * @return Type
-     */
-    public static function integer($value)
-    {
-        return new self(self::INTEGER, $value);
-    }
-
-    /**
-     * Long type
-     *
-     * @param  integer $value
-     * @return Type
-     */
-    public static function long($value)
-    {
-        return new self(self::LONG, $value);
-    }
-
-    /**
-     * Float type
-     *
-     * @param  integer $value
-     * @return Type
-     */
-    public static function float($value)
-    {
-        return new self(self::FLOAT, $value);
-    }
-
-    /**
-     * Double type
-     *
-     * @param  integer $value
-     * @return Type
-     */
-    public static function double($value)
-    {
-        return new self(self::DOUBLE, $value);
-    }
-
-    /**
-     * String type
-     *
-     * @param  string $value
-     * @return Type
-     */
-    public static function string($value)
-    {
-        return new self(self::STRING, $value);
-    }
-
-    /**
-     * Bool type
-     *
-     * @param  boolean $value
-     * @return Type
-     */
-    public static function bool($value)
-    {
-        return new self(self::BOOL, $value);
-    }
-
-    /**
-     * Boolean type
-     *
-     * @param  boolean $value
-     * @return Type
-     */
-    public static function boolean($value)
+    private function __construct()
     {
-        return new self(self::BOOLEAN, $value);
     }
 
     /**
-     * Arraylist type
      *
-     * @param  arraylist $value
-     * @return Type
+     * @param integer $value
+     * @return UniversalObject
      */
-    public static function arrayList($value)
+    public static function object($class, $properties)
     {
-        return new self(self::ARRAYLIST, $value);
+        $typeObj = new self();
+        $typeObj->className = $class;
+        $std = new \stdClass;
+        foreach ($properties as $key => $value) {
+            $std->$key = $value;
+        }
+        $typeObj->object = $std;
+        return $typeObj;
     }
 
     /**
-     * Map type
      *
-     * @param  map $value
-     * @return Type
+     * @param mixed $arg
+     * @return string
+     * @throws ConsumerException
      */
-    public static function map($value)
+    public static function argToType($arg)
     {
-        return new self(self::MAP, $value);
+        $type = gettype($arg);
+        switch ($type) {
+            case 'integer':
+            case 'boolean':
+            case 'double':
+            case 'string':
+            case 'NULL':
+                return self::adapter[Type::DEFAULT_TYPE];
+            case 'array':
+                if (Collection::isSequential($arg)) {
+                    return self::adapter[Type::ARRAYLIST];
+                } else {
+                    return self::adapter[Type::DEFAULT_TYPE];
+                }
+            case 'object':
+                if ($arg instanceof Type) {
+                    $className = $arg->className;
+                } else {
+                    $className = get_class($arg);
+                }
+                return 'L' . str_replace(['.', '\\'], '/', $className) . ';';
+            default:
+                throw new ConsumerException("Handler for type {$type} not implemented");
+        }
     }
-
     /**
-     * Object type
      *
-     * @param  integer $value
-     * @return UniversalObject
+     * @param int $arg
+     * @return int
      */
-    public static function object($class, $properties)
-    {
-        $std = new \stdClass;
-        foreach ($properties as $key => $value)
-        {
-            $std->$key = ($value instanceof Type) ? self::typeTosafe($value) : $value;
-        }
-        $std_wrap = new \stdClass();
-        $std_wrap->object = $std;
-        $std_wrap->class = 'L'.str_replace('.', '/', $class).';';
-        return $std_wrap;
-    }
 
-    public static function getDataForSafed($args)
+    /*
+    private static function numToType($value)
     {
-        foreach ($args as &$value)
-        {
-            if ($value instanceof \stdClass) {
-                $value = $value->object;
-            } elseif ($value instanceof Type) {
-                $value = self::typeTosafe($value);
-            }
+        if (-32768 <= $value && $value <= 32767) {
+            return Type::SHORT;
+        } elseif (-2147483648 <= $value && $value <= 2147483647) {
+            return Type::INT;
         }
-        return $args;
+        return Type::LONG;
     }
+    */
 
-    public static function  typeTosafe(Type $type)
-    {
-        switch ($type->type){
-            case Type::SHORT:
-            case Type::INT:
-            case Type::LONG:
-                $value = (int)$type->value;
-                break;
-            case Type::FLOAT:
-            case Type::DOUBLE:
-                $value = (float)$type->value;
-                break;
-            case Type::BOOLEAN:
-                $value = (bool)$type->value;
-                break;
-            case Type::ARRAYLIST:
-            case Type::MAP:
-                $value = (array)$type->value;
-                break;
-            case Type::STRING:
-            default:
-                $value = (string)$type->value;
-                break;
-        }
-        return $value;
-    }
 }
\ No newline at end of file
diff --git a/consumer/proxy/Proxy.php b/consumer/proxy/Proxy.php
index 723a4ba..3914ee4 100644
--- a/consumer/proxy/Proxy.php
+++ b/consumer/proxy/Proxy.php
@@ -18,6 +18,7 @@
 namespace com\fenqile\fsof\consumer\proxy;
 
 use com\fenqile\fsof\common\protocol\fsof\DubboRequest;
+use com\fenqile\fsof\consumer\ConsumerException;
 use com\fenqile\fsof\consumer\fsof\FSOFProcessor;
 use com\fenqile\fsof\consumer\Type;
 
@@ -85,13 +86,7 @@ final class Proxy
     {
         $types = [];
         foreach ($args as $val) {
-            if($val instanceof \stdClass){
-                $types[] = $val->class;
-            }else if($val instanceof Type){
-                $types[] = Type::adapter[$val->type]??'Ljava/lang/Object;';
-            }else{
-                $types[] = 'Ljava/lang/Object;';
-            }
+            $types[] = Type::argToType($val);
         }
         return $types;
     }
@@ -119,14 +114,14 @@ final class Proxy
             $request->setService($this->serviceInterface);
             $request->setMethod($args[0]);
             array_shift($args);
+            $request->setTypes($this->generateParamType($args));
             $request->setParams($args);
-            $request->setTypes($this->generateParamType($request->getParams()));
             $result = $this->fsofProcessor->executeRequest($request, $this->serviceAddress, $this->ioTimeOut, $providerAddress);
         }catch (\Exception $e) {
             $cost_time = (int)((microtime(true) - $begin_time) * 1000000);
             //记录consumer接口告警日志
             $this->setAccLog($request, $cost_time, $e->getMessage());
-            throw $e;
+            throw new ConsumerException($e->getMessage(), $e);
         }
         $cost_time = (int)((microtime(true) - $begin_time) * 1000000);
         //记录consumer接口告警日志