<?php
/**
 * 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.
 */
namespace com\fenqile\fsof\common\protocol\fsof;

use com\fenqile\fsof\consumer\Type;

class DubboRequest
{
    //包头字段
    private $twoWay = true;
    private $heartbeatEvent = false;
    private $sn;                    //请求序号
    private $serialization;
    private $fullData;                   //报文（包含消息头）
    private $dataLen;    //数据报文长度
    private $requestLen; //请求报文总长度(即消息头+消息体的长度)

    //包体字段
    private $dubboVersion = "2.0.0";       //dubbo 版本
    private $service;                      //服务名称
    private $version;                      //服务版本
    private $group;             //服务group
    private $method;                //方法名
    private $timeout;             //超时时间(ms)
    private $types;              //参数类型
    private $paramNum = 0;        //参数个数
    private $params = array();    //调用$method时的参数
    private $attach = array();

    /**
     * @return boolean
     */
    public function isTwoWay()
    {
        return $this->twoWay;
    }

    /**
     * @param boolean $twoWay
     */
    public function setTwoWay($twoWay)
    {
        $this->twoWay = $twoWay;
    }

    /**
     * @return mixed
     */
    public function getDataLen()
    {
        return $this->dataLen;
    }

    /**
     * @param mixed $dataLen
     */
    public function setDataLen($dataLen)
    {
        $this->dataLen = $dataLen;
    }

    /**
     * @return mixed
     */
    public function getRequestLen()
    {
        return $this->requestLen;
    }

    /**
     * @param mixed $requestLen
     */
    public function setRequestLen($requestLen)
    {
        $this->requestLen = $requestLen;
    }


    /**
     * @return boolean
     */
    public function isHeartbeatEvent()
    {
        return $this->heartbeatEvent;
    }

    /**
     * @param boolean $heartbeatEvent
     */
    public function setHeartbeatEvent($heartbeatEvent)
    {
        $this->heartbeatEvent = $heartbeatEvent;
    }


    /**
     * @return mixed
     */
    public function getSn()
    {
        return $this->sn;
    }

    /**
     * @param mixed $sn
     */
    public function setSn($sn)
    {
        $this->sn = $sn;
    }

    /**
     * @return mixed
     */
    public function getTimeout()
    {
        return $this->timeout;
    }

    /**
     * @param mixed $timeout
     */
    public function setTimeout($timeout)
    {
        $this->timeout = $timeout;
    }


    /**
     * @return mixed
     */
    public function getFullData()
    {
        return $this->fullData;
    }

    /**
     * @param mixed $fullData
     */
    public function setFullData($fullData)
    {
        $this->fullData = $fullData;
    }

    /**
     * @return string
     */
    public function getDubboVersion()
    {
        return $this->dubboVersion;
    }

    /**
     * @param string $dubboVersion
     */
    public function setDubboVersion($dubboVersion)
    {
        $this->dubboVersion = $dubboVersion;
    }

    /**
     * @return mixed
     */
    public function getService()
    {
        return $this->service;
    }

    /**
     * @param mixed $service
     */
    public function setService($service)
    {
        $this->service = $service;
    }

    /**
     * @return mixed
     */
    public function getVersion()
    {
        return $this->version;
    }

    /**
     * @param mixed $version
     */
    public function setVersion($version)
    {
        $this->version = $version;
    }

    /**
     * @return mixed
     */
    public function getGroup()
    {
        return $this->group;
    }

    /**
     * @param mixed $group
     */
    public function setGroup($group)
    {
        $this->group = $group;
    }

    /**
     * @return mixed
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * @param mixed $method
     */
    public function setMethod($method)
    {
        $this->method = $method;
    }

    /**
     * @return mixed
     */
    public function getTypes()
    {
        return $this->types;
    }

    /**
     * @param mixed $types
     */
    public function setTypes($types)
    {
        $this->types = $types;
    }

    /**
     * @return array
     */
    public function getParams()
    {
        return $this->params;
    }

    /**
     * @param array $params
     */
    public function setParams($params)
    {
        $this->params = $params;
        foreach ($this->params as &$val) {
            if ($val instanceof Type) {
                $val = $val->object;
            }
        }
    }

    /**
     * @return array
     */
    public function getAttach()
    {
        return $this->attach;
    }

    /**
     * @param array $attach
     */
    public function setAttach($attach)
    {
        $this->attach = $attach;
    }

    /**
     * @return mixed
     */
    public function getSerialization()
    {
        return $this->serialization;
    }

    /**
     * @param mixed $serialization
     */
    public function setSerialization($serialization)
    {
        $this->serialization = $serialization;
    }

    /**
     * @return int
     */
    public function getParamNum()
    {
        return $this->paramNum;
    }

    /**
     * @param int $paramNum
     */
    public function setParamNum($paramNum)
    {
        $this->paramNum = $paramNum;
    }


    //用于监控service中各方法的性能
    public $startTime;            //开始处理请求的时间
    public $endTime;            //请求处理结束的时间

    public $host;                //记录acc日志中的目标IP
    public $port;                //记录acc日志中的目标端口

    public $reqInfo = null;            //swoole框架记录的过载信息

    public $environment = "prod";


    public function __toString()
    {
        $ret = sprintf("%s:%s:%s->%s", $this->service, $this->version, $this->group, $this->method);
        return $ret;
    }
}