📄 davresourceimpl.java
字号:
/* * 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.simple;import org.apache.jackrabbit.JcrConstants;import org.apache.jackrabbit.server.io.ExportContext;import org.apache.jackrabbit.server.io.ExportContextImpl;import org.apache.jackrabbit.server.io.IOManager;import org.apache.jackrabbit.server.io.IOUtil;import org.apache.jackrabbit.server.io.ImportContext;import org.apache.jackrabbit.server.io.ImportContextImpl;import org.apache.jackrabbit.server.io.PropertyManager;import org.apache.jackrabbit.server.io.PropertyImportContext;import org.apache.jackrabbit.server.io.IOListener;import org.apache.jackrabbit.server.io.PropertyExportContext;import org.apache.jackrabbit.server.io.AbstractExportContext;import org.apache.jackrabbit.server.io.DefaultIOListener;import org.apache.jackrabbit.util.Text;import org.apache.jackrabbit.webdav.DavConstants;import org.apache.jackrabbit.webdav.DavException;import org.apache.jackrabbit.webdav.DavResource;import org.apache.jackrabbit.webdav.DavResourceFactory;import org.apache.jackrabbit.webdav.DavResourceIterator;import org.apache.jackrabbit.webdav.DavResourceIteratorImpl;import org.apache.jackrabbit.webdav.DavResourceLocator;import org.apache.jackrabbit.webdav.DavServletResponse;import org.apache.jackrabbit.webdav.DavSession;import org.apache.jackrabbit.webdav.MultiStatusResponse;import org.apache.jackrabbit.webdav.io.InputContext;import org.apache.jackrabbit.webdav.io.OutputContext;import org.apache.jackrabbit.webdav.jcr.JcrDavException;import org.apache.jackrabbit.webdav.jcr.JcrDavSession;import org.apache.jackrabbit.webdav.jcr.lock.JcrActiveLock;import org.apache.jackrabbit.webdav.lock.ActiveLock;import org.apache.jackrabbit.webdav.lock.LockDiscovery;import org.apache.jackrabbit.webdav.lock.LockInfo;import org.apache.jackrabbit.webdav.lock.LockManager;import org.apache.jackrabbit.webdav.lock.Scope;import org.apache.jackrabbit.webdav.lock.SupportedLock;import org.apache.jackrabbit.webdav.lock.Type;import org.apache.jackrabbit.webdav.observation.ObservationConstants;import org.apache.jackrabbit.webdav.property.DavProperty;import org.apache.jackrabbit.webdav.property.DavPropertyIterator;import org.apache.jackrabbit.webdav.property.DavPropertyName;import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;import org.apache.jackrabbit.webdav.property.DavPropertySet;import org.apache.jackrabbit.webdav.property.DefaultDavProperty;import org.apache.jackrabbit.webdav.property.ResourceType;import org.apache.jackrabbit.webdav.property.DavPropertyNameIterator;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.jcr.Item;import javax.jcr.Node;import javax.jcr.NodeIterator;import javax.jcr.PathNotFoundException;import javax.jcr.RepositoryException;import javax.jcr.Session;import javax.jcr.lock.Lock;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Collections;/** * DavResourceImpl implements a DavResource. */public class DavResourceImpl implements DavResource, JcrConstants { /** * the default logger */ private static final Logger log = LoggerFactory.getLogger(DavResourceImpl.class); private static final HashMap reservedNamespaces = new HashMap(); static { reservedNamespaces.put(DavConstants.NAMESPACE.getPrefix(), DavConstants.NAMESPACE.getURI()); reservedNamespaces.put(ObservationConstants.NAMESPACE.getPrefix(), ObservationConstants.NAMESPACE.getURI()); } private DavResourceFactory factory; private LockManager lockManager; private JcrDavSession session; private Node node; private DavResourceLocator locator; private DavPropertySet properties = new DavPropertySet(); private boolean inited = false; private boolean isCollection = true; private ItemFilter filter; private IOManager ioManager; private PropertyManager propManager; private long modificationTime = IOUtil.UNDEFINED_TIME; /** * Create a new {@link DavResource}. * * @param locator * @param factory * @param session */ public DavResourceImpl(DavResourceLocator locator, DavResourceFactory factory, DavSession session, ResourceConfig config) throws DavException { JcrDavSession.checkImplementation(session); this.session = (JcrDavSession)session; this.factory = factory; this.locator = locator; this.filter = config.getItemFilter(); this.ioManager = config.getIOManager(); this.propManager = config.getPropertyManager(); if (locator != null && locator.getRepositoryPath() != null) { try { Item item = getJcrSession().getItem(locator.getRepositoryPath()); if (item != null && item.isNode()) { node = (Node) item; // define what is a collection in webdav isCollection = config.isCollectionResource(node); } } catch (PathNotFoundException e) { // ignore: exists field evaluates to false } catch (RepositoryException e) { // some other error throw new JcrDavException(e); } } else { throw new DavException(DavServletResponse.SC_NOT_FOUND); } } /** * @return DavResource#COMPLIANCE_CLASS * @see org.apache.jackrabbit.webdav.DavResource#getComplianceClass() */ public String getComplianceClass() { return DavResource.COMPLIANCE_CLASS; } /** * @return DavResource#METHODS * @see org.apache.jackrabbit.webdav.DavResource#getSupportedMethods() */ public String getSupportedMethods() { return DavResource.METHODS; } /** * @see DavResource#exists() ) */ public boolean exists() { return node != null; } /** * @see DavResource#isCollection() */ public boolean isCollection() { return isCollection; } /** * Package protected method that allows to define whether this resource * represents a collection or not. * * @param isCollection */ void setIsCollection(boolean isCollection) { this.isCollection = isCollection; } /** * @see org.apache.jackrabbit.webdav.DavResource#getLocator() */ public DavResourceLocator getLocator() { return locator; } /** * @see DavResource#getResourcePath() */ public String getResourcePath() { return locator.getResourcePath(); } /** * @see DavResource#getHref() */ public String getHref() { return locator.getHref(isCollection()); } /** * Returns the the last segment of the resource path.<p> * Note that this must not correspond to the name of the underlying * repository item for two reasons:<ul> * <li>SameNameSiblings have an index appended to their item name.</li> * <li>the resource path may differ from the item path.</li> * </ul> * Using the item name as DAV:displayname caused problems with XP built-in * client in case of resources representing SameNameSibling nodes. * * @see DavResource#getDisplayName() */ public String getDisplayName() { String resPath = getResourcePath(); return (resPath != null) ? Text.getName(resPath) : resPath; } /** * @see org.apache.jackrabbit.webdav.DavResource#getModificationTime() */ public long getModificationTime() { initProperties(); return modificationTime; } /** * If this resource exists and the specified context is not <code>null</code> * this implementation build a new {@link ExportContext} based on the specified * context and forwards the export to its <code>IOManager</code>. If the * {@link IOManager#exportContent(ExportContext, DavResource)} fails, * an <code>IOException</code> is thrown. * * @see DavResource#spool(OutputContext) * @see ResourceConfig#getIOManager() * @throws IOException if the export fails. */ public void spool(OutputContext outputContext) throws IOException { if (exists() && outputContext != null) { ExportContext exportCtx = getExportContext(outputContext); if (!ioManager.exportContent(exportCtx, this)) { throw new IOException("Unexpected Error while spooling resource."); } } } /** * @see DavResource#getProperty(org.apache.jackrabbit.webdav.property.DavPropertyName) */ public DavProperty getProperty(DavPropertyName name) { initProperties(); return properties.get(name); } /** * @see DavResource#getProperties() */ public DavPropertySet getProperties() { initProperties(); return properties; } /** * @see DavResource#getPropertyNames() */ public DavPropertyName[] getPropertyNames() { return getProperties().getPropertyNames(); } /** * Fill the set of properties */ protected void initProperties() { if (!exists() || inited) { return; } try { propManager.exportProperties(getPropertyExportContext(), isCollection()); } catch (RepositoryException e) { log.warn("Error while accessing resource properties", e); } // set (or reset) fundamental properties if (getDisplayName() != null) { properties.add(new DefaultDavProperty(DavPropertyName.DISPLAYNAME, getDisplayName())); } if (isCollection()) { properties.add(new ResourceType(ResourceType.COLLECTION)); // Windows XP support properties.add(new DefaultDavProperty(DavPropertyName.ISCOLLECTION, "1")); } else { properties.add(new ResourceType(ResourceType.DEFAULT_RESOURCE)); // Windows XP support properties.add(new DefaultDavProperty(DavPropertyName.ISCOLLECTION, "0")); } /* set current lock information. If no lock is set to this resource, an empty lockdiscovery will be returned in the response. */ properties.add(new LockDiscovery(getLock(Type.WRITE, Scope.EXCLUSIVE))); /* lock support information: all locks are lockable. */ SupportedLock supportedLock = new SupportedLock(); supportedLock.addEntry(Type.WRITE, Scope.EXCLUSIVE); properties.add(supportedLock); inited = true; } /** * @param property * @throws DavException * @see DavResource#setProperty(org.apache.jackrabbit.webdav.property.DavProperty) */ public void setProperty(DavProperty property) throws DavException { alterProperty(property); } /** * @param propertyName * @throws DavException * @see DavResource#removeProperty(org.apache.jackrabbit.webdav.property.DavPropertyName) */ public void removeProperty(DavPropertyName propertyName) throws DavException { alterProperty(propertyName); } private void alterProperty(Object prop) throws DavException { if (isLocked(this)) { throw new DavException(DavServletResponse.SC_LOCKED); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -