blob: 54e911ea7386e8cf32a4a9ce8e3c3a5108c40e09 [file] [log] [blame]
<?php
/**
* File containing the ezcWebdavLockPropertyHandler class.
*
* 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.
*
* @package Webdav
* @version //autogentag//
* @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*
* @access private
*/
/**
* Property handler of the Lock plugin.
*
* This class is responsible of parsing and serializing the lock related properties:
*
* <ul>
* <li>{@link ezcWebdavLockDiscoveryProperty}</li>
* <li>{@link ezcWebdavSupportedLock}</li>
* </ul>
*
* @package Webdav
* @version //autogen//
*
* @access private
*/
class ezcWebdavLockPropertyHandler
{
/**
* Extracts a live property from a DOMElement.
*
* This method is responsible for parsing WebDAV live properties. The
* DOMElement $domElement must be an XML element in the DAV: namepsace. If
* the received property is not defined in RFC 2518, null is returned.
*
* @param DOMElement $domElement
* @param ezcWebdavXmlTool $xmlTool
* @return ezcWebdavLiveProperty|null
*/
public function extractLiveProperty( DOMElement $domElement, ezcWebdavXmlTool $xmlTool )
{
$property = null;
switch ( $domElement->localName )
{
case 'lockdiscovery':
$property = new ezcWebdavLockDiscoveryProperty();
foreach ( $domElement->childNodes as $activeLockChild )
{
if ( $activeLockChild->nodeType === XML_ELEMENT_NODE && $activeLockChild->localName === 'activelock' )
{
$property->activeLock->append( $this->extractActiveLockContent( $activeLockChild ) );
}
}
break;
case 'supportedlock':
$property = new ezcWebdavSupportedLockProperty();
foreach ( $domElement->childNodes as $childNode )
{
if ( $childNode->nodeType === XML_ELEMENT_NODE && $childNode->localName === 'lockentry' )
{
$property->lockEntries->append( $this->extractLockEntryContent( $childNode ) );
}
}
break;
}
return $property;
}
/**
* Extracts the <activelock /> XML elements.
* This method extracts the <activelock /> XML elements from the
* <lockdiscovery /> element and returns the corresponding
* ezcWebdavLockDiscoveryPropertyActiveLock object to be used as the
* content of ezcWebdavLockDiscoveryProperty.
*
* @param DOMElement $activeLockElement
* @return ezcWebdavLockDiscoveryPropertyActiveLock
*/
protected function extractActiveLockContent( DOMElement $activeLockElement )
{
$activeLock = new ezcWebdavLockDiscoveryPropertyActiveLock();
foreach ( $activeLockElement->childNodes as $currentElement )
{
if ( !( $currentElement instanceof DOMElement ) )
{
// Skip non element children
continue;
}
switch ( $currentElement->localName )
{
case 'locktype':
if ( $currentElement->hasChildNodes() && $currentElement->firstChild->localName !== 'write' )
{
$activeLock->lockType = ezcWebdavLockRequest::TYPE_READ;
}
else
{
$activeLock->lockType = ezcWebdavLockRequest::TYPE_WRITE;
}
break;
case 'lockscope':
if ( $currentElement->hasChildNodes() )
{
switch ( $currentElement->firstChild->localName )
{
case 'exclusive':
$activeLock->lockScope = ezcWebdavLockRequest::SCOPE_EXCLUSIVE;
break;
case 'shared':
$activeLock->lockScope = ezcWebdavLockRequest::SCOPE_SHARED;
break;
}
}
break;
case 'depth':
switch ( trim( $currentElement->nodeValue ) )
{
case '0':
$activeLock->depth = ezcWebdavRequest::DEPTH_ZERO;
break;
case '1':
$activeLock->depth = ezcWebdavRequest::DEPTH_ONE;
break;
case 'infinity':
$activeLock->depth = ezcWebdavRequest::DEPTH_INFINITY;
break;
}
break;
case 'owner':
$activeLock->owner = new ezcWebdavPotentialUriContent(
trim( $currentElement->textContent ),
// Owner indicated by an URI?
( $currentElement->hasChildNodes() && $currentElement->childNodes->item( 0 )->localName === 'href' )
);
break;
case 'timeout':
$timeoutVal = trim( $currentElement->nodeValue );
if ( substr( $timeoutVal, 0, 7 ) === 'Second-' )
{
$activeLock->timeout = (int) substr( $timeoutVal, 7 );
}
break;
case 'locktoken':
// @TODO: This may only be 1, no ArrayObject needed!
$activeLock->token = new ezcWebdavPotentialUriContent(
trim( $currentElement->textContent ),
// Is lock token represented by an URI?
( $currentElement->hasChildNodes() && $currentElement->firstChild->localName === 'href' )
);
break;
// Custom elements of the lock plugin
case 'baseuri':
if ( $currentElement->namespaceURI !== ezcWebdavLockPlugin::XML_NAMESPACE )
{
throw new ezcWebdavInvalidXmlException(
'Namespace of baseuri element is ' . $currentElement->namespaceURI . ', expected ' . ezcWebdavLockPlugin::XML_NAMESPACE
);
}
$activeLock->baseUri = $currentElement->textContent;
break;
case 'lastaccess':
if ( $currentElement->namespaceURI !== ezcWebdavLockPlugin::XML_NAMESPACE )
{
throw new ezcWebdavInvalidXmlException(
'Namespace of lastaccess element is ' . $currentElement->namespaceURI . ', expected ' . ezcWebdavLockPlugin::XML_NAMESPACE
);
}
$activeLock->lastAccess = new ezcWebdavDateTime( $currentElement->textContent );
break;
}
}
return $activeLock;
}
/**
* Extracts the <lockentry /> XML elements.
*
* This method extracts the <lockentry /> XML elements from the <supportedlock />
* element and returns the corresponding
* ezcWebdavSupportedLockPropertyLockentry object to be used as the content
* of ezcWebdavSupportedLockProperty.
*
* @param DOMElement $domElement
* @return ezcWebdavSupportedLockProperty
*/
protected function extractLockEntryContent( DOMElement $domElement )
{
return new ezcWebdavSupportedLockPropertyLockentry(
( $domElement->getElementsByTagNameNS( ezcWebdavXmlTool::XML_DEFAULT_NAMESPACE, 'locktype' )->item( 0 )->firstChild->localName === 'write'
? ezcWebdavLockRequest::TYPE_WRITE : ezcWebdavLockRequest::TYPE_READ ),
( $domElement->getElementsByTagNameNS( ezcWebdavXmlTool::XML_DEFAULT_NAMESPACE, 'lockscope' )->item( 0 )->firstChild->localName === 'shared'
? ezcWebdavLockRequest::SCOPE_SHARED : ezcWebdavLockRequest::SCOPE_EXCLUSIVE )
);
}
/**
* Returns the XML representation of a live property.
*
* Returns a DOMElement, representing the content of the given $property.
* The newly created element is also appended as a child to the given
* $parentElement.
*
* @param ezcWebdavLiveProperty $property
* @param DOMElement $parentElement
* @param ezcWebdavXmlTool $xmlTool
* @return DOMElement
*/
public function serializeLiveProperty( ezcWebdavLiveProperty $property, DOMElement $parentElement, ezcWebdavXmlTool $xmlTool )
{
switch ( get_class( $property ) )
{
case 'ezcWebdavLockDiscoveryProperty':
$elementName = 'lockdiscovery';
$elementValue = (
$property->activeLock !== null
? $this->serializeActiveLockContent( $property->activeLock, $parentElement->ownerDocument, $xmlTool )
: null
);
break;
case 'ezcWebdavSupportedLockProperty':
$elementName = 'supportedlock';
$elementValue = (
count( $property->lockEntries ) !== 0
? $this->serializeLockEntryContent( $property->lockEntries, $parentElement->ownerDocument, $xmlTool )
: null
);
break;
}
$propertyElement = $parentElement->appendChild(
$xmlTool->createDomElement( $parentElement->ownerDocument, $elementName, $property->namespace )
);
if ( $elementValue instanceof DOMDocument )
{
$propertyElement->appendChild(
$dom->importNode( $elementValue->documentElement, true )
);
}
else if ( is_array( $elementValue ) )
{
foreach ( $elementValue as $subValue )
{
$propertyElement->appendChild( $subValue );
}
}
else if ( is_scalar( $elementValue ) )
{
$propertyElement->nodeValue = $elementValue;
}
return $propertyElement;
}
/**
* Serializes an array of ezcWebdavLockDiscoveryPropertyActiveLock elements to XML.
*
* Receives an array of {@link ezcWebdavLockDiscoveryPropertyActiveLock}
* objects in $activeLocks and serializes them to XML nodes in the received
* $dom DOMDocument, using the received {@link ezcWebdavXmlTool} $xmlTool.
* The created DOMElement objects are returned as an error for further
* processing.
*
* @param ArrayObject(ezcWebdavLockDiscoveryPropertyActiveLock) $activeLocks
* @param DOMDocument $dom
* @param ezcWebdavXmlTool $xmlTool
* @return array(DOMElement)
*/
protected function serializeActiveLockContent( ArrayObject $activeLocks = null, DOMDocument $dom, ezcWebdavXmlTool $xmlTool )
{
$activeLockElements = array();
foreach ( $activeLocks as $activeLock )
{
$activeLockElement = $xmlTool->createDomElement( $dom, 'activelock' );
$activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'locktype' )
)->appendChild(
$xmlTool->createDomElement(
$dom, ( $activeLock->lockType === ezcWebdavLockRequest::TYPE_READ ? 'read' : 'write' )
)
);
$activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'lockscope' )
)->appendChild(
$xmlTool->createDomElement(
$dom, ( $activeLock->lockScope === ezcWebdavLockRequest::SCOPE_EXCLUSIVE ? 'exclusive' : 'shared' )
)
);
$depthElement = $activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'depth' )
);
switch ( $activeLock->depth )
{
case ezcWebdavRequest::DEPTH_ZERO:
$depthElement->nodeValue = '0';
break;
case ezcWebdavRequest::DEPTH_ONE:
$depthElement->nodeValue = '1';
break;
case ezcWebdavRequest::DEPTH_INFINITY:
$depthElement->nodeValue = 'Infinity';
break;
}
if ( $activeLock->owner !== null )
{
$ownerElement = $activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'owner' )
);
// If owner is represented by an URI, wrap it in <href>
if ( $activeLock->owner->isUri )
{
$ownerElement = $ownerElement->appendChild(
$xmlTool->createDomElement( $dom, 'href' )
);
}
$ownerElement->nodeValue = $activeLock->owner->content;
}
$activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'timeout' )
)->nodeValue = "Second-{$activeLock->timeout}";
$lockTokenElement = $activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'locktoken' )
);
if ( $activeLock->token->isUri )
{
$lockTokenElement = $lockTokenElement->appendChild(
$xmlTool->createDomElement( $dom, 'href' )
);
}
$lockTokenElement->nodeValue = $activeLock->token->content;
// Lock plugin custom elements
if ( $activeLock->baseUri !== null )
{
$activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'baseuri', ezcWebdavLockPlugin::XML_NAMESPACE )
)->nodeValue = $activeLock->baseUri;
}
if ( $activeLock->lastAccess !== null )
{
$activeLockElement->appendChild(
$xmlTool->createDomElement( $dom, 'lastaccess', ezcWebdavLockPlugin::XML_NAMESPACE )
)->nodeValue = $activeLock->lastAccess->format( 'c' );
}
$activeLockElements[] = $activeLockElement;
}
return $activeLockElements;
}
/**
* Serializes an array of ezcWebdavSupportedLockPropertyLockentry elements to XML.
*
* @param ArrayObject(ezcWebdavSupportedLockPropertyLockentry) $lockEntries
* @param DOMDocument $dom To create the returned DOMElements.
* @param ezcWebdavXmlTool $xmlTool
* @return array(DOMElement)
*/
protected function serializeLockEntryContent( ArrayObject $lockEntries = null, DOMDocument $dom, ezcWebdavXmlTool $xmlTool )
{
$lockEntryContentElements = array();
foreach ( $lockEntries as $lockEntry )
{
$lockEntryElement = $xmlTool->createDomElement( $dom, 'lockentry' );
$lockEntryElement->appendChild(
$xmlTool->createDomElement( $dom, 'lockscope' )
)->appendChild(
$xmlTool->createDomElement(
$dom, ( $lockEntry->lockScope === ezcWebdavLockRequest::SCOPE_EXCLUSIVE ? 'exclusive' : 'shared' )
)
);
$lockEntryElement->appendChild(
$xmlTool->createDomElement( $dom, 'locktype' )
)->appendChild(
$xmlTool->createDomElement(
$dom, ( $lockEntry->lockScope === ezcWebdavLockRequest::TYPE_READ ? 'read' : 'write' )
)
);
$lockEntryContentElements[] = $lockEntryElement;
}
return $lockEntryContentElements;
}
}
?>