📄 defaultitemcollection.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.jcr;import org.apache.jackrabbit.JcrConstants;import org.apache.jackrabbit.server.io.IOUtil;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.MultiStatusResponse;import org.apache.jackrabbit.webdav.xml.DomUtil;import org.apache.jackrabbit.webdav.io.InputContext;import org.apache.jackrabbit.webdav.io.OutputContext;import org.apache.jackrabbit.webdav.jcr.lock.JcrActiveLock;import org.apache.jackrabbit.webdav.jcr.lock.SessionScopedLockEntry;import org.apache.jackrabbit.webdav.jcr.nodetype.NodeTypeProperty;import org.apache.jackrabbit.webdav.jcr.version.report.ExportViewReport;import org.apache.jackrabbit.webdav.jcr.version.report.LocateCorrespondingNodeReport;import org.apache.jackrabbit.webdav.jcr.property.ValuesProperty;import org.apache.jackrabbit.webdav.lock.ActiveLock;import org.apache.jackrabbit.webdav.lock.LockInfo;import org.apache.jackrabbit.webdav.lock.Scope;import org.apache.jackrabbit.webdav.lock.Type;import org.apache.jackrabbit.webdav.ordering.OrderPatch;import org.apache.jackrabbit.webdav.ordering.OrderingConstants;import org.apache.jackrabbit.webdav.ordering.OrderingResource;import org.apache.jackrabbit.webdav.ordering.OrderingType;import org.apache.jackrabbit.webdav.ordering.Position;import org.apache.jackrabbit.webdav.property.DavProperty;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.HrefProperty;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.w3c.dom.Document;import org.xml.sax.SAXException;import javax.jcr.AccessDeniedException;import javax.jcr.ImportUUIDBehavior;import javax.jcr.Item;import javax.jcr.ItemExistsException;import javax.jcr.ItemNotFoundException;import javax.jcr.Node;import javax.jcr.NodeIterator;import javax.jcr.Property;import javax.jcr.PropertyIterator;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.Session;import javax.jcr.UnsupportedRepositoryOperationException;import javax.jcr.PathNotFoundException;import javax.jcr.lock.Lock;import javax.jcr.nodetype.NodeType;import javax.xml.parsers.ParserConfigurationException;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.Set;import java.util.List;/** * <code>DefaultItemCollection</code> represents a JCR node item. */public class DefaultItemCollection extends AbstractItemResource implements OrderingResource { private static Logger log = LoggerFactory.getLogger(DefaultItemCollection.class); private static final String TMP_PREFIX = "_tmp_"; /** * Create a new <code>DefaultItemCollection</code>. * * @param locator * @param session */ protected DefaultItemCollection(DavResourceLocator locator, JcrDavSession session, DavResourceFactory factory, Item item) { super(locator, session, factory, item); if (exists() && !(item instanceof Node)) { throw new IllegalArgumentException("A collection resource can not be constructed from a Property item."); } } //----------------------------------------------< DavResource interface >--- /** * @see org.apache.jackrabbit.webdav.DavResource#getComplianceClass() */ public String getComplianceClass() { String cc = super.getComplianceClass(); if (isOrderable()) { StringBuffer sb = new StringBuffer(cc); sb.append(", ").append(OrderingResource.COMPLIANCE_CLASS); return sb.toString(); } else { return cc; } } public long getModificationTime() { // retrieve mod-time from jcr:lastmodified property if existing if (exists()) { try { if (((Node)item).hasProperty(JcrConstants.JCR_LASTMODIFIED)) { return ((Node)item).getProperty(JcrConstants.JCR_LASTMODIFIED).getLong(); } } catch (RepositoryException e) { log.warn("Error while accessing jcr:lastModified property"); } } // fallback: return 'now' return new Date().getTime(); } /** * @see org.apache.jackrabbit.webdav.DavResource#getSupportedMethods() */ public String getSupportedMethods() { String ms = super.getSupportedMethods(); if (isOrderable()) { StringBuffer sb = new StringBuffer(ms); // Ordering if (isOrderable()) { sb.append(", ").append(OrderingResource.METHODS); } return sb.toString(); } else { return ms; } } /** * Always returns true * * @return true * @see org.apache.jackrabbit.webdav.DavResource#isCollection() */ public boolean isCollection() { return true; } /** * If this resource represents an existing <code>Node</code> the system * view is spooled as resource content. * * @param outputContext * @throws IOException * @see Session#exportSystemView(String, OutputStream, boolean, boolean) */ public void spool(OutputContext outputContext) throws IOException { // spool properties super.spool(outputContext); // spool data try { OutputStream out = outputContext.getOutputStream(); if (out != null && exists()) { getRepositorySession().exportSystemView(item.getPath(), out, false, true); } } catch (PathNotFoundException e) { log.error("Error while spooling resource content: " + e.getMessage()); } catch (RepositoryException e) { log.error("Error while spooling resource content: " + e.getMessage()); } } /** * This implementation of the <code>DavResource</code> does only allow * to set the mixinnodetypes property. Please note that the existing list of * mixin nodetypes will be completely replaced.<br> * In order to add / set any other repository property on the underlying * {@link javax.jcr.Node} use <code>addMember(DavResource)</code> or * <code>addMember(DavResource, InputStream)</code> or modify the value * of the corresponding resource. * * @param property * @throws org.apache.jackrabbit.webdav.DavException * @see org.apache.jackrabbit.webdav.DavResource#setProperty(org.apache.jackrabbit.webdav.property.DavProperty) * @see #JCR_MIXINNODETYPES */ public void setProperty(DavProperty property) throws DavException { internalSetProperty(property); complete(); } /** * Internal method used to set or add the given property * * @param property * @throws DavException * @see #setProperty(DavProperty) * @see #alterProperties(DavPropertySet, DavPropertyNameSet) */ private void internalSetProperty(DavProperty property) throws DavException { if (!exists()) { throw new DavException(DavServletResponse.SC_NOT_FOUND); } if (property.getName().equals(JCR_MIXINNODETYPES)) { Node n = (Node)item; try { NodeType[] existingMixin = n.getMixinNodeTypes(); NodeTypeProperty mix = new NodeTypeProperty(property); Set mixins = mix.getNodeTypeNames(); for (int i = 0; i < existingMixin.length; i++) { String name = existingMixin[i].getName(); if (mixins.contains(name)){ // do not add existing mixins mixins.remove(name); } else { // remove mixin that are not contained in the new list n.removeMixin(name); } } // add the remaining mixing types that are not yet set Iterator it = mixins.iterator(); while (it.hasNext()) { n.addMixin((String)it.next()); } } catch (RepositoryException e) { throw new JcrDavException(e); } } else { // all props except for mixinnodetypes are read-only throw new DavException(DavServletResponse.SC_CONFLICT); } } /** * This implementation of the <code>DavResource</code> does only allow * to remove the mixinnodetypes property. * * @param propertyName * @throws org.apache.jackrabbit.webdav.DavException * @see org.apache.jackrabbit.webdav.DavResource#removeProperty(org.apache.jackrabbit.webdav.property.DavPropertyName) * @see #JCR_MIXINNODETYPES */ public void removeProperty(DavPropertyName propertyName) throws DavException { internalRemoveProperty(propertyName); complete(); } /** * Internal method used to remove the property with the given name. * * @param propertyName * @throws DavException * @see #removeProperty(DavPropertyName) * @see #alterProperties(DavPropertySet, DavPropertyNameSet) */ private void internalRemoveProperty(DavPropertyName propertyName) throws DavException { if (!exists()) { throw new DavException(DavServletResponse.SC_NOT_FOUND); } if (JCR_MIXINNODETYPES.equals(propertyName)) { // remove all mixin nodetypes try { Node n = (Node)item; NodeType[] mixins = n.getMixinNodeTypes(); for (int i = 0; i < mixins.length; i++) { n.removeMixin(mixins[i].getName()); } } catch (RepositoryException e) { // NoSuchNodeTypeException, ConstraintViolationException should never occur... throw new JcrDavException(e); } } else { // all props except for mixinnodetypes are read-only throw new DavException(DavServletResponse.SC_CONFLICT); } } /** * Loops over the given <code>List</code>s and alters the properties accordingly. * Changes are persisted at the end according to the rules defined with * the {@link AbstractItemResource#complete()} method.<p> * Please note: since there is only a single property * ({@link ItemResourceConstants#JCR_MIXINNODETYPES} * that can be set or removed with PROPPATCH, this method either succeeds * or throws an exception, even if this violates RFC 2518. Thus no property * specific multistatus will be created in case of an error. * * @param changeList * @return * @throws DavException * @see DavResource#alterProperties(org.apache.jackrabbit.webdav.property.DavPropertySet, org.apache.jackrabbit.webdav.property.DavPropertyNameSet) */ public MultiStatusResponse alterProperties(List changeList) throws DavException { Iterator it = changeList.iterator();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -