All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jackrabbit.webdav.lock.LockDiscovery Maven / Gradle / Ivy

/*
 * 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 org.apache.jackrabbit.webdav.lock;

import org.apache.jackrabbit.webdav.property.AbstractDavProperty;
import org.apache.jackrabbit.webdav.property.DavPropertyName;
import org.apache.jackrabbit.webdav.xml.DomUtil;
import org.apache.jackrabbit.webdav.xml.ElementIterator;
import org.apache.jackrabbit.webdav.header.TimeoutHeader;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import java.util.ArrayList;
import java.util.List;

/**
 * The LockDiscovery class encapsulates the webdav lock discovery
 * property that is sent in the request body (PROPFIND and LOCK) and received
 * in a LOCK response body.
 */
public class LockDiscovery extends AbstractDavProperty> {

    /**
     * Listing of existing locks applied to the resource this discovery was
     * requested for. Each entry reveals, who has a lock, what type of lock he has,
     * the timeout type and the time remaining on the timeout, and the lock-type.
     * NOTE, that any of the information listed may be not available for the
     * server is free to withhold any or all of this information.
     */
    private List activeLocks = new ArrayList();

    /**
     * Creates a new empty LockDiscovery property
     */
    public LockDiscovery() {
        super(DavPropertyName.LOCKDISCOVERY, false);
    }

    /**
     * Create a new LockDiscovery property
     *
     * @param lock
     */
    public LockDiscovery(ActiveLock lock) {
        super(DavPropertyName.LOCKDISCOVERY, false);
        addActiveLock(lock);
    }

    /**
     * Create a new LockDiscovery property
     *
     * @param locks
     */
    public LockDiscovery(ActiveLock[] locks) {
        super(DavPropertyName.LOCKDISCOVERY, false);
        for (ActiveLock lock : locks) {
            addActiveLock(lock);
        }
    }

    private void addActiveLock(ActiveLock lock) {
        if (lock != null) {
            activeLocks.add(lock);
        }
    }

    /**
     * Returns the list of active locks.
     *
     * @return list of active locks
     * @see org.apache.jackrabbit.webdav.property.DavProperty#getValue()
     */
    public List getValue() {
        return activeLocks;
    }

    /**
     * Creates a <lockdiscovery> element in response
     * to a LOCK request or to the lockdiscovery property of a PROPFIND request.
* NOTE: if the {@link #activeLocks} list is empty an empty lockdiscovery * property is created ( <lockdiscovery/>) * @return A <lockdiscovery> element. * @param document */ @Override public Element toXml(Document document) { Element lockdiscovery = getName().toXml(document); for (ActiveLock lock : activeLocks) { lockdiscovery.appendChild(lock.toXml(document)); } return lockdiscovery; } //---------------------------------------------------< factory from xml >--- /** * Builds a new LockDiscovery object from the given xml element. * * @param lockDiscoveryElement * @return * @throws IllegalArgumentException if the given xml element is not a * DAV:lockdiscovery element. */ public static LockDiscovery createFromXml(Element lockDiscoveryElement) { if (!DomUtil.matches(lockDiscoveryElement, PROPERTY_LOCKDISCOVERY, NAMESPACE)) { throw new IllegalArgumentException("DAV:lockdiscovery element expected."); } List activeLocks = new ArrayList(); ElementIterator it = DomUtil.getChildren(lockDiscoveryElement, XML_ACTIVELOCK, NAMESPACE); while (it.hasNext()) { Element al = it.nextElement(); activeLocks.add(new ALockImpl(al)); } return new LockDiscovery(activeLocks.toArray(new ActiveLock[activeLocks.size()])); } //------< inner class >----------------------------------------------------- /** * Simple implementation of ActiveLock interface, that retrieves * the values from the DAV:activelock XML element.
* Note, that all set-methods as well as {@link #isExpired()} are not * implemented. */ private static class ALockImpl implements ActiveLock { private final Element alElement; private ALockImpl(Element alElement) { if (!DomUtil.matches(alElement, XML_ACTIVELOCK, NAMESPACE)) { throw new IllegalArgumentException("DAV:activelock element expected."); } this.alElement = alElement; } public boolean isLockedByToken(String lockToken) { String lt = getToken(); if (lt == null) { return false; } else { return lt.equals(lockToken); } } public boolean isExpired() { throw new UnsupportedOperationException("Not implemented"); } public String getToken() { Element ltEl = DomUtil.getChildElement(alElement, XML_LOCKTOKEN, NAMESPACE); if (ltEl != null) { return DomUtil.getChildText(ltEl, XML_HREF, NAMESPACE); } return null; } public String getOwner() { String owner = null; Element ow = DomUtil.getChildElement(alElement, XML_OWNER, NAMESPACE); if (ow != null) { if (DomUtil.hasChildElement(ow, XML_HREF, NAMESPACE)) { owner = DomUtil.getChildTextTrim(ow, XML_HREF, NAMESPACE); } else { owner = DomUtil.getTextTrim(ow); } } return owner; } public void setOwner(String owner) { throw new UnsupportedOperationException("Not implemented"); } public long getTimeout() { // get timeout string. if no DAV:timeout element is present, // 't' will be 'null' and the undefined timeout will be returned. String t = DomUtil.getChildTextTrim(alElement, XML_TIMEOUT, NAMESPACE); return TimeoutHeader.parse(t, UNDEFINED_TIMEOUT); } public void setTimeout(long timeout) { throw new UnsupportedOperationException("Not implemented"); } public boolean isDeep() { String depth = DomUtil.getChildTextTrim(alElement, XML_DEPTH, NAMESPACE); return DEPTH_INFINITY_S.equalsIgnoreCase(depth); } public void setIsDeep(boolean isDeep) { throw new UnsupportedOperationException("Not implemented"); } public String getLockroot() { Element root = DomUtil.getChildElement(alElement, XML_LOCKROOT, NAMESPACE); if (root != null) { return DomUtil.getChildTextTrim(root, XML_HREF, NAMESPACE); } // no lockroot element return null; } public void setLockroot(String lockroot) { throw new UnsupportedOperationException("Not implemented"); } public Type getType() { return Type.createFromXml(DomUtil.getChildElement(alElement, XML_LOCKTYPE, NAMESPACE)); } public Scope getScope() { return Scope.createFromXml(DomUtil.getChildElement(alElement, XML_LOCKSCOPE, NAMESPACE)); } public Element toXml(Document document) { return (Element) document.importNode(alElement, true); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy