|
1
|
|
|
<?php |
|
2
|
|
|
namespace Dkd\PhpCmis; |
|
3
|
|
|
|
|
4
|
|
|
/** |
|
5
|
|
|
* This file is part of php-cmis-client |
|
6
|
|
|
* |
|
7
|
|
|
* (c) Sascha Egerer <[email protected]> |
|
8
|
|
|
* |
|
9
|
|
|
* For the full copyright and license information, please view the LICENSE |
|
10
|
|
|
* file that was distributed with this source code. |
|
11
|
|
|
*/ |
|
12
|
|
|
|
|
13
|
|
|
use Dkd\PhpCmis\CmisObject\CmisObjectInterface; |
|
14
|
|
|
use Dkd\PhpCmis\Data\AceInterface; |
|
15
|
|
|
use Dkd\PhpCmis\Data\AclInterface; |
|
16
|
|
|
use Dkd\PhpCmis\Data\BindingsObjectFactoryInterface; |
|
17
|
|
|
use Dkd\PhpCmis\Data\ChangeEventInfoInterface; |
|
18
|
|
|
use Dkd\PhpCmis\Data\ObjectDataInterface; |
|
19
|
|
|
use Dkd\PhpCmis\Data\ObjectListInterface; |
|
20
|
|
|
use Dkd\PhpCmis\Data\ObjectTypeInterface; |
|
21
|
|
|
use Dkd\PhpCmis\Data\PolicyInterface; |
|
22
|
|
|
use Dkd\PhpCmis\Data\PropertiesInterface; |
|
23
|
|
|
use Dkd\PhpCmis\Data\PropertyDataInterface; |
|
24
|
|
|
use Dkd\PhpCmis\Data\PropertyInterface; |
|
25
|
|
|
use Dkd\PhpCmis\Data\RenditionDataInterface; |
|
26
|
|
|
use Dkd\PhpCmis\Data\RenditionInterface; |
|
27
|
|
|
use Dkd\PhpCmis\Data\RepositoryInfoInterface; |
|
28
|
|
|
use Dkd\PhpCmis\Data\SecondaryTypeInterface; |
|
29
|
|
|
use Dkd\PhpCmis\DataObjects\Document; |
|
30
|
|
|
use Dkd\PhpCmis\DataObjects\DocumentType; |
|
31
|
|
|
use Dkd\PhpCmis\DataObjects\DocumentTypeDefinition; |
|
32
|
|
|
use Dkd\PhpCmis\DataObjects\Folder; |
|
33
|
|
|
use Dkd\PhpCmis\DataObjects\FolderType; |
|
34
|
|
|
use Dkd\PhpCmis\DataObjects\FolderTypeDefinition; |
|
35
|
|
|
use Dkd\PhpCmis\DataObjects\Item; |
|
36
|
|
|
use Dkd\PhpCmis\DataObjects\ItemType; |
|
37
|
|
|
use Dkd\PhpCmis\DataObjects\ItemTypeDefinition; |
|
38
|
|
|
use Dkd\PhpCmis\DataObjects\Policy; |
|
39
|
|
|
use Dkd\PhpCmis\DataObjects\PolicyType; |
|
40
|
|
|
use Dkd\PhpCmis\DataObjects\PolicyTypeDefinition; |
|
41
|
|
|
use Dkd\PhpCmis\DataObjects\Property; |
|
42
|
|
|
use Dkd\PhpCmis\DataObjects\PropertyId; |
|
43
|
|
|
use Dkd\PhpCmis\DataObjects\Relationship; |
|
44
|
|
|
use Dkd\PhpCmis\DataObjects\RelationshipType; |
|
45
|
|
|
use Dkd\PhpCmis\DataObjects\RelationshipTypeDefinition; |
|
46
|
|
|
use Dkd\PhpCmis\DataObjects\Rendition; |
|
47
|
|
|
use Dkd\PhpCmis\DataObjects\SecondaryType; |
|
48
|
|
|
use Dkd\PhpCmis\DataObjects\SecondaryTypeDefinition; |
|
49
|
|
|
use Dkd\PhpCmis\Definitions\DocumentTypeDefinitionInterface; |
|
50
|
|
|
use Dkd\PhpCmis\Definitions\FolderTypeDefinitionInterface; |
|
51
|
|
|
use Dkd\PhpCmis\Definitions\ItemTypeDefinitionInterface; |
|
52
|
|
|
use Dkd\PhpCmis\Definitions\PolicyTypeDefinitionInterface; |
|
53
|
|
|
use Dkd\PhpCmis\Definitions\PropertyDefinitionInterface; |
|
54
|
|
|
use Dkd\PhpCmis\Definitions\RelationshipTypeDefinitionInterface; |
|
55
|
|
|
use Dkd\PhpCmis\Definitions\SecondaryTypeDefinitionInterface; |
|
56
|
|
|
use Dkd\PhpCmis\Definitions\TypeDefinitionInterface; |
|
57
|
|
|
use Dkd\PhpCmis\Definitions\TypeMutabilityInterface; |
|
58
|
|
|
use Dkd\PhpCmis\Enum\BaseTypeId; |
|
59
|
|
|
use Dkd\PhpCmis\Enum\Cardinality; |
|
60
|
|
|
use Dkd\PhpCmis\Enum\Updatability; |
|
61
|
|
|
use Dkd\PhpCmis\Exception\CmisInvalidArgumentException; |
|
62
|
|
|
use Dkd\PhpCmis\Exception\CmisRuntimeException; |
|
63
|
|
|
use GuzzleHttp\Stream\StreamInterface; |
|
64
|
|
|
|
|
65
|
|
|
/** |
|
66
|
|
|
* Object Factory implementation |
|
67
|
|
|
* |
|
68
|
|
|
* @author Sascha Egerer <[email protected]> |
|
69
|
|
|
*/ |
|
70
|
|
|
class ObjectFactory implements ObjectFactoryInterface |
|
71
|
|
|
{ |
|
72
|
|
|
/** |
|
73
|
|
|
* @var SessionInterface |
|
74
|
|
|
*/ |
|
75
|
|
|
protected $session; |
|
76
|
|
|
|
|
77
|
|
|
/** |
|
78
|
|
|
* Initialize the object factory with a session. |
|
79
|
|
|
* |
|
80
|
|
|
* @param SessionInterface $session |
|
81
|
|
|
* @param string[] $parameters |
|
82
|
|
|
*/ |
|
83
|
31 |
|
public function initialize(SessionInterface $session, $parameters = array()) |
|
84
|
|
|
{ |
|
85
|
31 |
|
$this->session = $session; |
|
86
|
31 |
|
} |
|
87
|
|
|
|
|
88
|
|
|
/** |
|
89
|
|
|
* Convert ACEs to an ACL. |
|
90
|
|
|
* |
|
91
|
|
|
* This method does not create a copy of the ACE as the Java OpenCMIS implementation does. # |
|
92
|
|
|
* For details see the discussion in the mailing list |
|
93
|
|
|
* |
|
94
|
|
|
* @see http://mail-archives.apache.org/mod_mbox/chemistry-dev/201501.mbox/<[email protected]> |
|
95
|
|
|
* |
|
96
|
|
|
* @param AceInterface[] $aces |
|
97
|
|
|
* @return AclInterface |
|
98
|
|
|
*/ |
|
99
|
1 |
|
public function convertAces(array $aces) |
|
100
|
|
|
{ |
|
101
|
1 |
|
return $this->getBindingsObjectFactory()->createAccessControlList($aces); |
|
102
|
|
|
} |
|
103
|
|
|
|
|
104
|
|
|
/** |
|
105
|
|
|
* @param ObjectDataInterface $objectData |
|
106
|
|
|
* @return ChangeEventInfoInterface |
|
107
|
|
|
*/ |
|
108
|
|
|
public function convertChangeEvent(ObjectDataInterface $objectData) |
|
109
|
|
|
{ |
|
110
|
|
|
// TODO: Implement convertChangeEvent() method. |
|
111
|
|
|
} |
|
112
|
|
|
|
|
113
|
|
|
/** |
|
114
|
|
|
* @param string $changeLogToken |
|
115
|
|
|
* @param ObjectListInterface $objectList |
|
116
|
|
|
* @return ChangeEventsInterface |
|
117
|
|
|
*/ |
|
118
|
|
|
public function convertChangeEvents($changeLogToken, ObjectListInterface $objectList) |
|
119
|
|
|
{ |
|
120
|
|
|
// TODO: Implement convertChangeEvents() method. |
|
121
|
|
|
} |
|
122
|
|
|
|
|
123
|
|
|
/** |
|
124
|
|
|
* Converts a high level ContentStream object into a low level ContentStream object. |
|
125
|
|
|
* |
|
126
|
|
|
* @param StreamInterface $contentStream the original ContentStream object |
|
127
|
|
|
* @return StreamInterface the ContentStream object |
|
128
|
|
|
*/ |
|
129
|
|
|
public function convertContentStream(StreamInterface $contentStream) |
|
130
|
|
|
{ |
|
131
|
|
|
// TODO: Implement convertContentStream() method. |
|
132
|
|
|
return $contentStream; |
|
133
|
|
|
} |
|
134
|
|
|
|
|
135
|
|
|
/** |
|
136
|
|
|
* Convert given ObjectData to a high level API object |
|
137
|
|
|
* |
|
138
|
|
|
* @param ObjectDataInterface $objectData |
|
139
|
|
|
* @param OperationContextInterface $context |
|
140
|
|
|
* @return CmisObjectInterface |
|
141
|
|
|
* @throws CmisRuntimeException |
|
142
|
|
|
*/ |
|
143
|
|
|
public function convertObject(ObjectDataInterface $objectData, OperationContextInterface $context) |
|
144
|
|
|
{ |
|
145
|
|
|
$type = $this->getTypeFromObjectData($objectData); |
|
146
|
|
|
if ($type === null) { |
|
147
|
|
|
throw new CmisRuntimeException('Could not get type from object data.'); |
|
148
|
|
|
} |
|
149
|
|
|
$baseTypeId = $objectData->getBaseTypeId(); |
|
150
|
|
|
|
|
151
|
|
|
if ($baseTypeId->equals(BaseTypeId::CMIS_DOCUMENT)) { |
|
152
|
|
|
return new Document($this->session, $type, $context, $objectData); |
|
153
|
|
|
} elseif ($baseTypeId->equals(BaseTypeId::CMIS_FOLDER)) { |
|
154
|
|
|
return new Folder($this->session, $type, $context, $objectData); |
|
155
|
|
|
} elseif ($baseTypeId->equals(BaseTypeId::CMIS_POLICY)) { |
|
156
|
|
|
return new Policy($this->session, $type, $context, $objectData); |
|
157
|
|
|
} elseif ($baseTypeId->equals(BaseTypeId::CMIS_RELATIONSHIP)) { |
|
158
|
|
|
return new Relationship($this->session, $type, $context, $objectData); |
|
159
|
|
|
} elseif ($baseTypeId->equals(BaseTypeId::CMIS_ITEM)) { |
|
160
|
|
|
return new Item($this->session, $type, $context, $objectData); |
|
161
|
|
|
} elseif ($baseTypeId->equals(BaseTypeId::CMIS_SECONDARY)) { |
|
162
|
|
|
throw new CmisRuntimeException('Secondary type is used as object type: ' . $baseTypeId); |
|
163
|
|
|
} else { |
|
164
|
|
|
throw new CmisRuntimeException('Unsupported base type: ' . $baseTypeId); |
|
165
|
|
|
} |
|
166
|
|
|
} |
|
167
|
|
|
|
|
168
|
|
|
/** |
|
169
|
|
|
* Converts a list of Policy objects into a list of there string representations |
|
170
|
|
|
* |
|
171
|
|
|
* @param PolicyInterface[] $policies |
|
172
|
|
|
* @return string[] |
|
173
|
|
|
*/ |
|
174
|
|
|
public function convertPolicies(array $policies) |
|
175
|
|
|
{ |
|
176
|
|
|
$result = array(); |
|
177
|
|
|
|
|
178
|
|
|
foreach ($policies as $policy) { |
|
179
|
|
|
if ($policy->getId() !== null) { |
|
180
|
|
|
$result[] = $policy->getId(); |
|
181
|
|
|
} |
|
182
|
|
|
} |
|
183
|
|
|
|
|
184
|
|
|
return $result; |
|
185
|
|
|
} |
|
186
|
|
|
|
|
187
|
|
|
/** |
|
188
|
|
|
* Convert Properties in Properties instance to a list of PropertyInterface objects |
|
189
|
|
|
* |
|
190
|
|
|
* @param ObjectTypeInterface $objectType |
|
191
|
|
|
* @param SecondaryTypeInterface[] $secondaryTypes |
|
192
|
|
|
* @param PropertiesInterface $properties |
|
193
|
|
|
* @return PropertyInterface[] |
|
194
|
|
|
* @throws CmisInvalidArgumentException |
|
195
|
|
|
*/ |
|
196
|
|
|
public function convertPropertiesDataToPropertyList( |
|
197
|
|
|
ObjectTypeInterface $objectType, |
|
198
|
|
|
array $secondaryTypes, |
|
199
|
|
|
PropertiesInterface $properties |
|
200
|
|
|
) { |
|
201
|
|
|
if (count($objectType->getPropertyDefinitions()) === 0) { |
|
202
|
|
|
throw new CmisInvalidArgumentException('Object type has no property definitions!'); |
|
203
|
|
|
} |
|
204
|
|
|
if (count($properties->getProperties()) === 0) { |
|
205
|
|
|
throw new CmisInvalidArgumentException('Properties must be set'); |
|
206
|
|
|
} |
|
207
|
|
|
|
|
208
|
|
|
// Iterate trough properties and convert them to Property objects |
|
209
|
|
|
$result = array(); |
|
210
|
|
|
foreach ($properties->getProperties() as $propertyKey => $propertyData) { |
|
211
|
|
|
// find property definition |
|
212
|
|
|
$apiProperty = $this->convertProperty($objectType, $secondaryTypes, $propertyData); |
|
213
|
|
|
$result[$propertyKey] = $apiProperty; |
|
214
|
|
|
} |
|
215
|
|
|
|
|
216
|
|
|
return $result; |
|
217
|
|
|
} |
|
218
|
|
|
|
|
219
|
|
|
/** |
|
220
|
|
|
* Convert PropertyData into a property API object |
|
221
|
|
|
* |
|
222
|
|
|
* @param ObjectTypeInterface $objectType |
|
223
|
|
|
* @param SecondaryTypeInterface[] $secondaryTypes |
|
224
|
|
|
* @param PropertyDataInterface $propertyData |
|
225
|
|
|
* @return PropertyInterface |
|
226
|
|
|
* @throws CmisRuntimeException |
|
227
|
|
|
*/ |
|
228
|
|
|
protected function convertProperty( |
|
229
|
|
|
ObjectTypeInterface $objectType, |
|
230
|
|
|
array $secondaryTypes, |
|
231
|
|
|
PropertyDataInterface $propertyData |
|
232
|
|
|
) { |
|
233
|
|
|
$definition = $objectType->getPropertyDefinition($propertyData->getId()); |
|
234
|
|
|
|
|
235
|
|
|
// search secondary types |
|
236
|
|
|
if ($definition === null && !empty($secondaryTypes)) { |
|
237
|
|
|
foreach ($secondaryTypes as $secondaryType) { |
|
238
|
|
|
$propertyDefinitions = $secondaryType->getPropertyDefinitions(); |
|
239
|
|
View Code Duplication |
if (!empty($propertyDefinitions)) { |
|
240
|
|
|
$definition = $secondaryType->getPropertyDefinition($propertyData->getId()); |
|
241
|
|
|
if ($definition !== null) { |
|
242
|
|
|
break; |
|
243
|
|
|
} |
|
244
|
|
|
} |
|
245
|
|
|
} |
|
246
|
|
|
} |
|
247
|
|
|
|
|
248
|
|
|
// the type might have changed -> reload type definitions |
|
249
|
|
|
if ($definition === null) { |
|
250
|
|
|
$reloadedObjectType = $this->session->getTypeDefinition($objectType->getId(), false); |
|
251
|
|
|
$definition = $reloadedObjectType->getPropertyDefinition($propertyData->getId()); |
|
252
|
|
|
|
|
253
|
|
|
if ($definition === null && !empty($secondaryTypes)) { |
|
254
|
|
|
foreach ($secondaryTypes as $secondaryType) { |
|
255
|
|
|
$reloadedSecondaryType = $this->session->getTypeDefinition($secondaryType->getId(), false); |
|
256
|
|
|
$propertyDefinitions = $reloadedSecondaryType->getPropertyDefinitions(); |
|
257
|
|
View Code Duplication |
if (!empty($propertyDefinitions)) { |
|
258
|
|
|
$definition = $reloadedSecondaryType->getPropertyDefinition($propertyData->getId()); |
|
259
|
|
|
if ($definition !== null) { |
|
260
|
|
|
break; |
|
261
|
|
|
} |
|
262
|
|
|
} |
|
263
|
|
|
} |
|
264
|
|
|
} |
|
265
|
|
|
} |
|
266
|
|
|
|
|
267
|
|
|
if ($definition === null) { |
|
268
|
|
|
// property without definition |
|
269
|
|
|
throw new CmisRuntimeException(sprintf('Property "%s" doesn\'t exist!', $propertyData->getId())); |
|
270
|
|
|
} |
|
271
|
|
|
|
|
272
|
|
|
return $this->createProperty($definition, $propertyData->getValues()); |
|
273
|
|
|
} |
|
274
|
|
|
|
|
275
|
|
|
/** |
|
276
|
|
|
* Convert properties to their property data objects and put them into a Properties object |
|
277
|
|
|
* |
|
278
|
|
|
* @param mixed[] $properties |
|
279
|
|
|
* @param ObjectTypeInterface|null $type |
|
280
|
|
|
* @param SecondaryTypeInterface[] $secondaryTypes |
|
281
|
|
|
* @param Updatability[] $updatabilityFilter |
|
282
|
|
|
* @return PropertiesInterface |
|
283
|
|
|
* @throws CmisInvalidArgumentException |
|
284
|
|
|
*/ |
|
285
|
2 |
|
public function convertProperties( |
|
286
|
|
|
array $properties, |
|
287
|
|
|
ObjectTypeInterface $type = null, |
|
288
|
|
|
array $secondaryTypes = array(), |
|
289
|
|
|
array $updatabilityFilter = array() |
|
290
|
|
|
) { |
|
291
|
2 |
|
if (empty($properties)) { |
|
292
|
1 |
|
return null; |
|
293
|
|
|
} |
|
294
|
|
|
|
|
295
|
1 |
|
if ($type === null) { |
|
296
|
1 |
|
$type = $this->getTypeDefinition( |
|
297
|
1 |
|
isset($properties[PropertyIds::OBJECT_TYPE_ID]) ? $properties[PropertyIds::OBJECT_TYPE_ID] : null |
|
298
|
1 |
|
); |
|
299
|
1 |
|
} |
|
300
|
|
|
|
|
301
|
|
|
// get secondary types |
|
302
|
1 |
|
$allSecondaryTypes = array(); |
|
303
|
1 |
|
$secondaryTypeIds = $this->getValueFromArray(PropertyIds::SECONDARY_OBJECT_TYPE_IDS, $properties); |
|
304
|
|
|
|
|
305
|
1 |
|
if (is_array($secondaryTypeIds)) { |
|
306
|
|
|
foreach ($secondaryTypeIds as $secondaryTypeId) { |
|
307
|
|
|
$secondaryType = $this->getTypeDefinition((string) $secondaryTypeId); |
|
308
|
|
|
|
|
309
|
|
|
if (!$secondaryType instanceof SecondaryType) { |
|
310
|
|
|
throw new CmisInvalidArgumentException( |
|
311
|
|
|
'Secondary types property contains a type that is not a secondary type: ' . $secondaryTypeId, |
|
312
|
|
|
1425479398 |
|
313
|
|
|
); |
|
314
|
|
|
} |
|
315
|
|
|
$allSecondaryTypes[] = $secondaryType; |
|
316
|
|
|
} |
|
317
|
1 |
|
} elseif ($secondaryTypeIds !== null) { |
|
318
|
1 |
|
throw new CmisInvalidArgumentException( |
|
319
|
1 |
|
sprintf( |
|
320
|
1 |
|
'The property "%s" must be of type array or undefined but is of type "%s"', |
|
321
|
1 |
|
PropertyIds::SECONDARY_OBJECT_TYPE_IDS, |
|
322
|
1 |
|
gettype($secondaryTypeIds) |
|
323
|
1 |
|
), |
|
324
|
|
|
1425473414 |
|
325
|
1 |
|
); |
|
326
|
|
|
} |
|
327
|
|
|
|
|
328
|
|
|
if (!empty($secondaryTypes) && empty($allSecondaryTypes)) { |
|
329
|
|
|
$allSecondaryTypes = $secondaryTypes; |
|
330
|
|
|
} |
|
331
|
|
|
|
|
332
|
|
|
$propertyList = array(); |
|
333
|
|
|
|
|
334
|
|
|
foreach ($properties as $propertyId => $propertyValue) { |
|
335
|
|
|
$value = $propertyValue; |
|
336
|
|
|
|
|
337
|
|
|
if ($value instanceof PropertyInterface) { |
|
338
|
|
|
if ($value->getId() !== $propertyId) { |
|
339
|
|
|
throw new CmisInvalidArgumentException( |
|
340
|
|
|
sprintf('Property id mismatch: "%s" != "%s"', $propertyId, $value->getId()) |
|
341
|
|
|
); |
|
342
|
|
|
} |
|
343
|
|
|
$value = ($value->isMultiValued()) ? $value->getValues() : $value->getFirstValue(); |
|
344
|
|
|
} |
|
345
|
|
|
|
|
346
|
|
|
$definition = $type->getPropertyDefinition($propertyId); |
|
347
|
|
|
|
|
348
|
|
|
if ($definition === null && !empty($allSecondaryTypes)) { |
|
349
|
|
|
foreach ($allSecondaryTypes as $secondaryType) { |
|
350
|
|
|
$definition = $secondaryType->getPropertyDefinition($propertyId); |
|
351
|
|
|
|
|
352
|
|
|
if ($definition !== null) { |
|
353
|
|
|
break; |
|
354
|
|
|
} |
|
355
|
|
|
} |
|
356
|
|
|
} |
|
357
|
|
|
|
|
358
|
|
|
if ($definition === null) { |
|
359
|
|
|
throw new CmisInvalidArgumentException( |
|
360
|
|
|
sprintf('Property "%s" is not valid for this type or one of the secondary types!', $propertyId) |
|
361
|
|
|
); |
|
362
|
|
|
} |
|
363
|
|
|
|
|
364
|
|
|
// check updatability |
|
365
|
|
|
if (!empty($updatabilityFilter) && !in_array($definition->getUpdatability(), $updatabilityFilter)) { |
|
366
|
|
|
continue; |
|
367
|
|
|
} |
|
368
|
|
|
|
|
369
|
|
|
if (is_array($value)) { |
|
370
|
|
|
if (!$definition->getCardinality()->equals(Cardinality::MULTI)) { |
|
371
|
|
|
throw new CmisInvalidArgumentException( |
|
372
|
|
|
sprintf('Property "%s" is not a multi value property but multiple values given!', $propertyId) |
|
373
|
|
|
); |
|
374
|
|
|
} |
|
375
|
|
|
$values = $value; |
|
376
|
|
|
} else { |
|
377
|
|
|
if (!$definition->getCardinality()->equals(Cardinality::SINGLE)) { |
|
378
|
|
|
throw new CmisInvalidArgumentException( |
|
379
|
|
|
sprintf('Property "%s" is not a single value property but single value given!', $propertyId) |
|
380
|
|
|
); |
|
381
|
|
|
} |
|
382
|
|
|
$values = array(); |
|
383
|
|
|
$values[] = $value; |
|
384
|
|
|
} |
|
385
|
|
|
|
|
386
|
|
|
$propertyList[] = $this->getBindingsObjectFactory()->createPropertyData($definition, $values); |
|
387
|
|
|
} |
|
388
|
|
|
|
|
389
|
|
|
return $this->getBindingsObjectFactory()->createPropertiesData($propertyList); |
|
390
|
|
|
} |
|
391
|
|
|
|
|
392
|
|
|
/** |
|
393
|
|
|
* Get a type definition for the given object type id. If an empty id is given throw an exception. |
|
394
|
|
|
* |
|
395
|
|
|
* @param string $objectTypeId |
|
396
|
|
|
* @return ObjectTypeInterface |
|
397
|
|
|
* @throws CmisInvalidArgumentException |
|
398
|
|
|
*/ |
|
399
|
1 |
|
private function getTypeDefinition($objectTypeId) |
|
400
|
|
|
{ |
|
401
|
1 |
|
if (empty($objectTypeId) || !is_string($objectTypeId)) { |
|
402
|
|
|
throw new CmisInvalidArgumentException( |
|
403
|
|
|
'Type property must be set and must be of type string but is empty or not a string.' |
|
404
|
|
|
); |
|
405
|
|
|
} |
|
406
|
|
|
|
|
407
|
1 |
|
return $this->session->getTypeDefinition($objectTypeId); |
|
408
|
|
|
} |
|
409
|
|
|
|
|
410
|
|
|
/** |
|
411
|
|
|
* Get a value from an array. Return <code>null</code> if the key does not exist in the array. |
|
412
|
|
|
* |
|
413
|
|
|
* @param integer|string $needle |
|
414
|
|
|
* @param mixed $haystack |
|
415
|
|
|
* @return mixed |
|
416
|
|
|
*/ |
|
417
|
1 |
|
private function getValueFromArray($needle, $haystack) |
|
418
|
|
|
{ |
|
419
|
1 |
|
if (!is_array($haystack) || !isset($haystack[$needle])) { |
|
420
|
|
|
return null; |
|
421
|
|
|
} |
|
422
|
|
|
|
|
423
|
1 |
|
return $haystack[$needle]; |
|
424
|
|
|
} |
|
425
|
|
|
|
|
426
|
|
|
/** |
|
427
|
|
|
* @param PropertiesInterface $properties |
|
428
|
|
|
* @return PropertyDataInterface[] |
|
429
|
|
|
*/ |
|
430
|
9 |
|
public function convertQueryProperties(PropertiesInterface $properties) |
|
431
|
|
|
{ |
|
432
|
9 |
|
return $properties->getProperties(); |
|
433
|
|
|
} |
|
434
|
|
|
|
|
435
|
|
|
/** |
|
436
|
|
|
* Converts ObjectData to QueryResult |
|
437
|
|
|
* |
|
438
|
|
|
* @param ObjectDataInterface $objectData |
|
439
|
|
|
* @return QueryResult |
|
440
|
|
|
*/ |
|
441
|
1 |
|
public function convertQueryResult(ObjectDataInterface $objectData) |
|
442
|
|
|
{ |
|
443
|
1 |
|
return new QueryResult($this->session, $objectData); |
|
444
|
|
|
} |
|
445
|
|
|
|
|
446
|
|
|
/** |
|
447
|
|
|
* Converts RenditionData to Rendition |
|
448
|
|
|
* |
|
449
|
|
|
* @param string $objectId |
|
450
|
|
|
* @param RenditionDataInterface $renditionData |
|
451
|
|
|
* @return RenditionInterface |
|
452
|
|
|
*/ |
|
453
|
|
|
public function convertRendition($objectId, RenditionDataInterface $renditionData) |
|
454
|
|
|
{ |
|
455
|
|
|
$rendition = new Rendition($this->session, $objectId); |
|
456
|
|
|
$rendition->populate($renditionData); |
|
457
|
|
|
|
|
458
|
|
|
return $rendition; |
|
459
|
|
|
} |
|
460
|
|
|
|
|
461
|
|
|
/** |
|
462
|
|
|
* @param RepositoryInfoInterface $repositoryInfo |
|
463
|
|
|
* @return RepositoryInfoInterface |
|
464
|
|
|
*/ |
|
465
|
|
|
public function convertRepositoryInfo(RepositoryInfoInterface $repositoryInfo) |
|
466
|
|
|
{ |
|
467
|
|
|
// TODO: Implement convertRepositoryInfo() method. |
|
468
|
|
|
} |
|
469
|
|
|
|
|
470
|
|
|
/** |
|
471
|
|
|
* Convert a type definition to a type |
|
472
|
|
|
* |
|
473
|
|
|
* @param TypeDefinitionInterface $typeDefinition |
|
474
|
|
|
* @return ObjectTypeInterface |
|
475
|
|
|
* @throws CmisRuntimeException |
|
476
|
|
|
*/ |
|
477
|
7 |
|
public function convertTypeDefinition(TypeDefinitionInterface $typeDefinition) |
|
478
|
|
|
{ |
|
479
|
7 |
|
if ($typeDefinition instanceof DocumentTypeDefinitionInterface) { |
|
480
|
1 |
|
return new DocumentType($this->session, $typeDefinition); |
|
481
|
6 |
|
} elseif ($typeDefinition instanceof FolderTypeDefinitionInterface) { |
|
482
|
1 |
|
return new FolderType($this->session, $typeDefinition); |
|
483
|
5 |
|
} elseif ($typeDefinition instanceof RelationshipTypeDefinitionInterface) { |
|
484
|
1 |
|
return new RelationshipType($this->session, $typeDefinition); |
|
485
|
4 |
|
} elseif ($typeDefinition instanceof PolicyTypeDefinitionInterface) { |
|
486
|
1 |
|
return new PolicyType($this->session, $typeDefinition); |
|
487
|
3 |
|
} elseif ($typeDefinition instanceof ItemTypeDefinitionInterface) { |
|
488
|
1 |
|
return new ItemType($this->session, $typeDefinition); |
|
489
|
2 |
|
} elseif ($typeDefinition instanceof SecondaryTypeDefinitionInterface) { |
|
490
|
1 |
|
return new SecondaryType($this->session, $typeDefinition); |
|
491
|
|
|
} else { |
|
492
|
1 |
|
throw new CmisRuntimeException( |
|
493
|
1 |
|
sprintf('Unknown base type! Received "%s"', + get_class($typeDefinition)), |
|
494
|
|
|
1422028427 |
|
495
|
1 |
|
); |
|
496
|
|
|
} |
|
497
|
|
|
} |
|
498
|
|
|
|
|
499
|
|
|
/** |
|
500
|
|
|
* @param string $principal |
|
501
|
|
|
* @param string[] $permissions |
|
502
|
|
|
* @return AceInterface |
|
503
|
|
|
*/ |
|
504
|
|
|
public function createAce($principal, array $permissions) |
|
505
|
|
|
{ |
|
506
|
|
|
// TODO: Implement createAce() method. |
|
507
|
|
|
} |
|
508
|
|
|
|
|
509
|
|
|
/** |
|
510
|
|
|
* @param AceInterface[] $aces |
|
511
|
|
|
* @return AclInterface |
|
512
|
|
|
*/ |
|
513
|
|
|
public function createAcl(array $aces) |
|
514
|
|
|
{ |
|
515
|
|
|
// TODO: Implement createAcl() method. |
|
516
|
|
|
} |
|
517
|
|
|
|
|
518
|
|
|
/** |
|
519
|
|
|
* Creates an object that implements the ContentStream interface. |
|
520
|
|
|
* |
|
521
|
|
|
* @param string $filename |
|
522
|
|
|
* @param integer $length |
|
523
|
|
|
* @param string $mimeType |
|
524
|
|
|
* @param mixed $stream @TODO define datatype |
|
525
|
|
|
* @param boolean $partial |
|
526
|
|
|
* @return StreamInterface |
|
527
|
|
|
*/ |
|
528
|
|
|
public function createContentStream($filename, $length, $mimeType, $stream, $partial = false) |
|
529
|
|
|
{ |
|
530
|
|
|
// TODO: Implement createContentStream() method. |
|
531
|
|
|
} |
|
532
|
|
|
|
|
533
|
|
|
/** |
|
534
|
|
|
* Create a public API Property that contains the property definition and values. |
|
535
|
|
|
* |
|
536
|
|
|
* @param PropertyDefinitionInterface $type |
|
537
|
|
|
* @param array $values |
|
538
|
|
|
* @return Property |
|
539
|
|
|
*/ |
|
540
|
|
|
public function createProperty(PropertyDefinitionInterface $type, array $values) |
|
541
|
|
|
{ |
|
542
|
|
|
return new Property($type, $values); |
|
543
|
|
|
} |
|
544
|
|
|
|
|
545
|
|
|
/** |
|
546
|
|
|
* Try to determined what object type the given objectData belongs to and return that type. |
|
547
|
|
|
* |
|
548
|
|
|
* @param ObjectDataInterface $objectData |
|
549
|
|
|
* @return ObjectTypeInterface|null The object type or <code>null</code> if type could not be determined |
|
550
|
|
|
*/ |
|
551
|
|
|
public function getTypeFromObjectData(ObjectDataInterface $objectData) |
|
552
|
|
|
{ |
|
553
|
|
|
if ($objectData->getProperties() === null || count($objectData->getProperties()->getProperties()) === 0) { |
|
554
|
|
|
return null; |
|
555
|
|
|
} |
|
556
|
|
|
|
|
557
|
|
|
$typeProperty = $objectData->getProperties()->getProperties()[PropertyIds::OBJECT_TYPE_ID]; |
|
558
|
|
|
|
|
559
|
|
|
if (!$typeProperty instanceof PropertyId) { |
|
560
|
|
|
return null; |
|
561
|
|
|
} |
|
562
|
|
|
|
|
563
|
|
|
return $this->session->getTypeDefinition($typeProperty->getFirstValue()); |
|
564
|
|
|
} |
|
565
|
|
|
|
|
566
|
|
|
/** |
|
567
|
|
|
* Get the bindings object factory for the current session binding |
|
568
|
|
|
* |
|
569
|
|
|
* @return BindingsObjectFactoryInterface |
|
570
|
|
|
*/ |
|
571
|
1 |
|
protected function getBindingsObjectFactory() |
|
572
|
|
|
{ |
|
573
|
1 |
|
return $this->session->getBinding()->getObjectFactory(); |
|
574
|
|
|
} |
|
575
|
|
|
|
|
576
|
|
|
/** |
|
577
|
|
|
* Create a type definition with all required properties. |
|
578
|
|
|
* |
|
579
|
|
|
* @param string $id This opaque attribute identifies this object-type in the repository. |
|
580
|
|
|
* @param string $localName This attribute represents the underlying repository’s name for the object-type. |
|
581
|
|
|
* This field is opaque and has no uniqueness constraint imposed by this specification. |
|
582
|
|
|
* @param string $baseTypeIdString A value that indicates whether the base type for this object-type is the |
|
583
|
|
|
* document, folder, relationship, policy, item, or secondary base type. |
|
584
|
|
|
* @param string $parentId The id of the object-type’s immediate parent type. It MUST be "not set" for a base |
|
585
|
|
|
* type. Depending on the binding this means it might not exist on the base type object-type definition. |
|
586
|
|
|
* @param boolean $creatable Indicates whether new objects of this type MAY be created. If the value of this |
|
587
|
|
|
* attribute is FALSE, the repository MAY contain objects of this type already, but MUST NOT allow new objects |
|
588
|
|
|
* of this type to be created. |
|
589
|
|
|
* @param boolean $fileable Indicates whether or not objects of this type are file-able. |
|
590
|
|
|
* @param boolean $queryable Indicates whether or not this object-type can appear in the FROM clause of a query |
|
591
|
|
|
* statement. A non-queryable object-type is not visible through the relational view that is used for query, |
|
592
|
|
|
* and CAN NOT appear in the FROM clause of a query statement. |
|
593
|
|
|
* @param boolean $controllablePolicy Indicates whether or not objects of this type are controllable via policies. |
|
594
|
|
|
* Policy objects can only be applied to controllablePolicy objects. |
|
595
|
|
|
* @param boolean $controllableACL This attribute indicates whether or not objects of this type are controllable by |
|
596
|
|
|
* ACL’s. Only objects that are controllableACL can have an ACL. |
|
597
|
|
|
* @param boolean $fulltextIndexed Indicates whether objects of this type are indexed for full-text search for |
|
598
|
|
|
* querying via the CONTAINS() query predicate. If the value of this attribute is TRUE, the full-text index |
|
599
|
|
|
* MUST cover the content and MAY cover the metadata. |
|
600
|
|
|
* @param boolean $includedInSupertypeQuery Indicates whether this type and its subtypes appear in a query of this |
|
601
|
|
|
* type’s ancestor types. For example: if Invoice is a sub-type of cmis:document, if this is TRUE on Invoice |
|
602
|
|
|
* then for a query on cmis:document, instances of Invoice will be returned if they match. If this attribute |
|
603
|
|
|
* is FALSE, no instances of Invoice will be returned even if they match the query. |
|
604
|
|
|
* @param string $localNamespace This attribute allows repositories to represent the internal namespace of |
|
605
|
|
|
* the underlying repository’s name for the object-type. |
|
606
|
|
|
* @param string $queryName Used for query and filter operations on object-types. This is an opaque string with |
|
607
|
|
|
* limitations. See 2.1.2.1.3 Query Names of the CMIS 1.1 standard for details. |
|
608
|
|
|
* @param string $displayName Used for presentation by application. |
|
609
|
|
|
* @param string $description Description of this object-type, such as the nature of content, or its intended use. |
|
610
|
|
|
* Used for presentation by application. |
|
611
|
|
|
* @param TypeMutabilityInterface|null $typeMutability |
|
612
|
|
|
* typeMutability.create - Indicates whether new child types may be created with this type as the parent. |
|
613
|
|
|
* typeMutability.update - Indicates whether clients may make changes to this type per the constraints |
|
614
|
|
|
* defined in this specification. |
|
615
|
|
|
* typeMutability.delete - Indicates whether clients may delete this type if there are no instances of it in |
|
616
|
|
|
* the repository. |
|
617
|
|
|
* @return FolderTypeDefinition|DocumentTypeDefinition|RelationshipTypeDefinition|PolicyTypeDefinition|ItemTypeDefinition|SecondaryTypeDefinition |
|
618
|
|
|
*/ |
|
619
|
|
|
public function createTypeDefinition( |
|
620
|
|
|
$id, |
|
621
|
|
|
$localName, |
|
622
|
|
|
$baseTypeIdString, |
|
623
|
|
|
$parentId, |
|
624
|
|
|
$creatable, |
|
625
|
|
|
$fileable, |
|
626
|
|
|
$queryable, |
|
627
|
|
|
$controllablePolicy, |
|
628
|
|
|
$controllableACL, |
|
629
|
|
|
$fulltextIndexed, |
|
630
|
|
|
$includedInSupertypeQuery, |
|
631
|
|
|
$localNamespace = '', |
|
632
|
|
|
$queryName = '', |
|
633
|
|
|
$displayName = '', |
|
634
|
|
|
$description = '', |
|
635
|
|
|
TypeMutabilityInterface $typeMutability = null |
|
636
|
|
|
) { |
|
637
|
|
|
$typeDefinition = $this->getBindingsObjectFactory()->getTypeDefinitionByBaseTypeId($baseTypeIdString, $id); |
|
638
|
|
|
|
|
639
|
|
|
$typeDefinition->setLocalName($localName); |
|
640
|
|
|
$typeDefinition->setParentTypeId($parentId); |
|
641
|
|
|
$typeDefinition->setIsCreatable($creatable); |
|
642
|
|
|
$typeDefinition->setIsFileable($fileable); |
|
643
|
|
|
$typeDefinition->setIsQueryable($queryable); |
|
644
|
|
|
$typeDefinition->setisControllablePolicy($controllablePolicy); |
|
645
|
|
|
$typeDefinition->setIsControllableAcl($controllableACL); |
|
646
|
|
|
$typeDefinition->setIsFulltextIndexed($fulltextIndexed); |
|
647
|
|
|
$typeDefinition->setIsIncludedInSupertypeQuery($includedInSupertypeQuery); |
|
648
|
|
|
$typeDefinition->setLocalNamespace($localNamespace); |
|
649
|
|
|
$typeDefinition->setQueryName($queryName); |
|
650
|
|
|
$typeDefinition->setDisplayName($displayName); |
|
651
|
|
|
$typeDefinition->setDescription($description); |
|
652
|
|
|
if ($typeMutability !== null) { |
|
653
|
|
|
$typeDefinition->setTypeMutability($typeMutability); |
|
654
|
|
|
} |
|
655
|
|
|
|
|
656
|
|
|
return $typeDefinition; |
|
657
|
|
|
} |
|
658
|
|
|
} |
|
659
|
|
|
|