summaryrefslogtreecommitdiff
path: root/vendor/ruflin/elastica/lib/Elastica/Transport/AbstractTransport.php
blob: d2ce0fb20f0e1d89e1d0916a78084a5500fb4a2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php

namespace Elastica\Transport;

use Elastica\Connection;
use Elastica\Request;
use Elastica\Exception\InvalidException;
use Elastica\Param;

/**
 * Elastica Abstract Transport object
 *
 * @category Xodoa
 * @package Elastica
 * @author Nicolas Ruflin <spam@ruflin.com>
 */
abstract class AbstractTransport extends Param
{
    /**
     * @var \Elastica\Connection
     */
    protected $_connection;

    /**
     * Construct transport
     *
     * @param \Elastica\Connection $connection Connection object
     */
    public function __construct(Connection $connection = null)
    {
        if ($connection) {
            $this->setConnection($connection);
        }
    }

    /**
     * @return \Elastica\Connection Connection object
     */
    public function getConnection()
    {
        return $this->_connection;
    }

    /**
     * @param \Elastica\Connection $connection Connection object
     */
    public function setConnection(Connection $connection)
    {
        $this->_connection = $connection;
    }

    /**
     * Executes the transport request
     *
     * @param  \Elastica\Request  $request Request object
     * @param  array             $params  Hostname, port, path, ...
     * @return \Elastica\Response Response object
     */
    abstract public function exec(Request $request, array $params);

    /**
     * Create a transport
     *
     * The $transport parameter can be one of the following values:
     *
     * * string: The short name of a transport. For instance "Http", "Memcache" or "Thrift"
     * * object: An already instantiated instance of a transport
     * * array: An array with a "type" key which must be set to one of the two options. All other
     *          keys in the array will be set as parameters in the transport instance
     *
     * @param mixed $transport A transport definition
     * @param \Elastica\Connection $connection A connection instance
     * @param array $params Parameters for the transport class
     * @throws \Elastica\Exception\InvalidException
     * @return AbstractTransport
     */
    public static function create($transport, Connection $connection, array $params = array())
    {
        if (is_array($transport) && isset($transport['type'])) {
            $transportParams = $transport;
            unset($transportParams['type']);

            $params = array_replace($params, $transportParams);
            $transport = $transport['type'];
        }

        if (is_string($transport)) {
            $className = 'Elastica\\Transport\\' . $transport;

            if (!class_exists($className)) {
                throw new InvalidException('Invalid transport');
            }

            $transport = new $className;
        }

        if ($transport instanceof AbstractTransport) {
            $transport->setConnection($connection);

            foreach ($params as $key => $value) {
                $transport->setParam($key, $value);
            }
        } else {
            throw new InvalidException('Invalid transport');
        }

        return $transport;
    }
}