-
Notifications
You must be signed in to change notification settings - Fork 27
/
RepositoryFactoryJackrabbit.php
138 lines (122 loc) · 6.01 KB
/
RepositoryFactoryJackrabbit.php
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
namespace Jackalope;
use PHPCR\ConfigurationException;
use PHPCR\RepositoryFactoryInterface;
/**
* This factory creates repositories with the jackrabbit transport.
*
* Use repository factory based on parameters (the parameters below are examples):
*
* <pre>
* $parameters = array('jackalope.jackrabbit_uri' => 'http://localhost:8080/server/');
* $factory = new \Jackalope\RepositoryFactoryJackrabbit;
* $repo = $factory->getRepository($parameters);
* </pre>
*
* @license http://www.apache.org/licenses Apache License Version 2.0, January 2004
* @license http://opensource.org/licenses/MIT MIT License
*
* @api
*/
class RepositoryFactoryJackrabbit implements RepositoryFactoryInterface
{
/**
* list of required parameters for jackrabbit.
*
* @var array
*/
private static $required = [
'jackalope.jackrabbit_uri' => 'string (required): Path to the jackrabbit server',
];
/**
* list of optional parameters for jackrabbit.
*
* @var array
*/
private static $optional = [
'jackalope.factory' => 'string or object: Use a custom factory class for Jackalope objects',
'jackalope.default_header' => 'string: Set a default header to send on each request to the backend (i.e. for load balancers to identify sessions)',
'jackalope.jackrabbit_expect' => 'boolean: Send the "Expect: 100-continue" header on larger PUT and POST requests. Disabled by default to avoid issues with proxies and load balancers.',
'jackalope.check_login_on_server' => 'boolean: if set to empty or false, skip initial check whether repository exists. Enabled by default, disable to gain a few milliseconds off each repository instantiation.',
'jackalope.disable_stream_wrapper' => 'boolean: if set and not empty, stream wrapper is disabled, otherwise the stream wrapper is enabled and streams are only fetched when reading from for the first time. If your code always uses all binary properties it reads, you can disable this for a small performance gain.',
'jackalope.logger' => 'Psr\Log\LoggerInterface: Use the LoggingClient to wrap the default transport Client',
Session::OPTION_AUTO_LASTMODIFIED => 'boolean: Whether to automatically update nodes having mix:lastModified. Defaults to true.',
'jackalope.jackrabbit_force_http_version_10' => 'boolean: Force HTTP version 1.0, this can in solving problems with curl such as https://github.com/jackalope/jackalope-jackrabbit/issues/89',
'jackalope.jackrabbit_curl_options' => 'array: Additional global curl-options',
'jackalope.jackrabbit_version' => 'string: Set the version of the jackrabbit server to allow the client to offer better functionality if possible',
];
/**
* Get a repository connected to the jackrabbit backend specified in the
* parameters.
*
* {@inheritDoc}
*
* Jackrabbit repositories have no default repository, passing null as
* parameters will always return null.
*
* @api
*/
public function getRepository(array $parameters = null)
{
if (null === $parameters) {
throw new ConfigurationException('Jackalope-jackrabbit needs parameters');
}
// check if we have all required parameters
if (count(array_diff_key(self::$required, $parameters))) {
throw new ConfigurationException('A required parameter is missing: '.implode(', ', array_keys(array_diff_key(self::$required, $parameters))));
}
// check if we have any unknown parameters
if (count(array_diff_key($parameters, self::$required, self::$optional))) {
throw new ConfigurationException('Additional unknown parameters found: '.implode(', ', array_keys(array_diff_key($parameters, self::$required, self::$optional))));
}
if (isset($parameters['jackalope.factory'])) {
$factory = $parameters['jackalope.factory'] instanceof FactoryInterface
? $parameters['jackalope.factory'] : new $parameters['jackalope.factory']();
} else {
$factory = new Jackrabbit\Factory();
}
$uri = $parameters['jackalope.jackrabbit_uri'];
if ('/' !== substr($uri, -1, 1)) {
$uri .= '/';
}
$transport = $factory->get('Transport\Jackrabbit\Client', [$uri]);
if (isset($parameters['jackalope.default_header'])) {
$transport->addDefaultHeader($parameters['jackalope.default_header']);
}
if (isset($parameters['jackalope.jackrabbit_expect'])) {
$transport->sendExpect($parameters['jackalope.jackrabbit_expect']);
}
if (isset($parameters['jackalope.check_login_on_server'])) {
$transport->setCheckLoginOnServer($parameters['jackalope.check_login_on_server']);
}
if (isset($parameters['jackalope.jackrabbit_version'])) {
$transport->setVersion($parameters['jackalope.jackrabbit_version']);
}
if (isset($parameters['jackalope.logger'])) {
$transport = $factory->get(
'Transport\Jackrabbit\LoggingClient',
[$transport, $parameters['jackalope.logger']]
);
}
$curlOptions = array_key_exists('jackalope.jackrabbit_curl_options', $parameters) ?
$parameters['jackalope.jackrabbit_curl_options'] : [];
if (isset($parameters['jackalope.jackrabbit_force_http_version_10'])) {
$curlOptions[CURLOPT_HTTP_VERSION] = true;
}
if (count($curlOptions)) {
$transport->addCurlOptions($curlOptions);
}
$options['stream_wrapper'] = empty($parameters['jackalope.disable_stream_wrapper']);
if (isset($parameters[Session::OPTION_AUTO_LASTMODIFIED])) {
$options[Session::OPTION_AUTO_LASTMODIFIED] = $parameters[Session::OPTION_AUTO_LASTMODIFIED];
}
return new Repository($factory, $transport, $options);
}
/**
* @api
*/
public function getConfigurationKeys()
{
return array_merge(self::$required, self::$optional);
}
}