/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.webdav.resource;
import org.exoplatform.common.util.HierarchicalProperty;
import org.exoplatform.services.jcr.webdav.xml.WebDavNamespaceContext;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.net.URI;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.jcr.RepositoryException;
import javax.xml.namespace.QName;
/**
* Created by The eXo Platform SARL .<br>
* Abstract WebDav Resource implementation It is recommended to extend this
* class instead of implement Resource itself
*
* @author Gennady Azarenkov
* @version $Id: $
*/
public abstract class GenericResource implements Resource
{
private static final Log LOG = ExoLogger.getLogger("org.exoplatform.services.jcr.webdav.resource.GenericResource");
/**
* Resource identifier.
*/
protected final URI identifier;
/**
* Resource type.
*/
protected final int type;
/**
* Namespace context.
*/
protected final WebDavNamespaceContext namespaceContext;
/**
* Properties which are set by JCR.
*/
protected static final Set<QName> PRESET_PROP = new HashSet<QName>();
static
{
PRESET_PROP.add(DISPLAYNAME);
PRESET_PROP.add(RESOURCETYPE);
PRESET_PROP.add(CREATIONDATE);
}
/**
* @param type resource type
* @param identifier resource identifier
* @param namespaceContext namespace context
*/
public GenericResource(final int type, final URI identifier, final WebDavNamespaceContext namespaceContext)
{
this.type = type;
this.identifier = identifier;
this.namespaceContext = namespaceContext;
}
/**
* {@inheritDoc}
*/
public final URI getIdentifier()
{
return identifier;
}
/**
* {@inheritDoc}
*/
public final int getType()
{
return type;
}
/**
* {@inheritDoc}
*/
public Set<HierarchicalProperty> getProperties(boolean namesOnly) throws RepositoryException
{
Set<HierarchicalProperty> props = new HashSet<HierarchicalProperty>();
Iterator<QName> propIter = PRESET_PROP.iterator();
while (propIter.hasNext())
{
QName propertyName = propIter.next();
try
{
props.add(namesOnly ? new HierarchicalProperty(propertyName) : getProperty(propertyName));
}
catch (Exception exc)
{
if (LOG.isTraceEnabled())
{
LOG.trace("An exception occurred: " + exc.getMessage());
}
}
}
return props;
}
/**
* {@inheritDoc}
*/
public final WebDavNamespaceContext getNamespaceContext()
{
return namespaceContext;
}
/**
* Returns the information about lock.
*
* @param token lock token
* @param lockOwner lockowner
* @param timeOut lock timeout
* @return lock information
*/
public static HierarchicalProperty lockDiscovery(String token, String lockOwner, String timeOut)
{
HierarchicalProperty lockDiscovery = new HierarchicalProperty(new QName("DAV:", "lockdiscovery"));
HierarchicalProperty activeLock =
lockDiscovery.addChild(new HierarchicalProperty(new QName("DAV:", "activelock")));
HierarchicalProperty lockType = activeLock.addChild(new HierarchicalProperty(new QName("DAV:", "locktype")));
lockType.addChild(new HierarchicalProperty(new QName("DAV:", "write")));
HierarchicalProperty lockScope = activeLock.addChild(new HierarchicalProperty(new QName("DAV:", "lockscope")));
lockScope.addChild(new HierarchicalProperty(new QName("DAV:", "exclusive")));
HierarchicalProperty depth = activeLock.addChild(new HierarchicalProperty(new QName("DAV:", "depth")));
depth.setValue("Infinity");
if (lockOwner != null)
{
HierarchicalProperty owner = activeLock.addChild(new HierarchicalProperty(new QName("DAV:", "owner")));
owner.setValue(lockOwner);
}
HierarchicalProperty timeout = activeLock.addChild(new HierarchicalProperty(new QName("DAV:", "timeout")));
timeout.setValue("Second-" + timeOut);
if (token != null)
{
HierarchicalProperty lockToken = activeLock.addChild(new HierarchicalProperty(new QName("DAV:", "locktoken")));
HierarchicalProperty lockHref = lockToken.addChild(new HierarchicalProperty(new QName("DAV:", "href")));
lockHref.setValue(token);
}
return lockDiscovery;
}
/**
* The information about supported locks.
*
* @return information about supported locks
*/
protected HierarchicalProperty supportedLock()
{
HierarchicalProperty supportedLock = new HierarchicalProperty(new QName("DAV:", "supportedlock"));
HierarchicalProperty lockEntry = new HierarchicalProperty(new QName("DAV:", "lockentry"));
supportedLock.addChild(lockEntry);
HierarchicalProperty lockScope = new HierarchicalProperty(new QName("DAV:", "lockscope"));
lockScope.addChild(new HierarchicalProperty(new QName("DAV:", "exclusive")));
lockEntry.addChild(lockScope);
HierarchicalProperty lockType = new HierarchicalProperty(new QName("DAV:", "locktype"));
lockType.addChild(new HierarchicalProperty(new QName("DAV:", "write")));
lockEntry.addChild(lockType);
return supportedLock;
}
/**
* The information about supported methods.
*
* @return information about supported methods
*/
protected HierarchicalProperty supportedMethodSet()
{
HierarchicalProperty supportedMethodProp = new HierarchicalProperty(SUPPORTEDMETHODSET);
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "PROPFIND");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "OPTIONS");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "DELETE");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "PROPPATCH");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "CHECKIN");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "CHECKOUT");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "REPORT");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "UNCHECKOUT");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "PUT");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "GET");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "HEAD");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "COPY");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "MOVE");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "VERSION-CONTROL");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "LABEL");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "LOCK");
supportedMethodProp.addChild(new HierarchicalProperty(new QName("DAV:", "supported-method"))).setAttribute(
"name", "UNLOCK");
return supportedMethodProp;
}
}