⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 versioncontrolleditemcollection.java

📁 jsr170接口的java实现。是个apache的开源项目。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * 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.webdav.DavException;import org.apache.jackrabbit.webdav.DavLocatorFactory;import org.apache.jackrabbit.webdav.DavResource;import org.apache.jackrabbit.webdav.DavResourceFactory;import org.apache.jackrabbit.webdav.DavResourceLocator;import org.apache.jackrabbit.webdav.DavServletResponse;import org.apache.jackrabbit.webdav.MultiStatus;import org.apache.jackrabbit.webdav.MultiStatusResponse;import org.apache.jackrabbit.webdav.property.DavPropertyName;import org.apache.jackrabbit.webdav.property.DefaultDavProperty;import org.apache.jackrabbit.webdav.property.HrefProperty;import org.apache.jackrabbit.webdav.property.DavProperty;import org.apache.jackrabbit.webdav.version.LabelInfo;import org.apache.jackrabbit.webdav.version.MergeInfo;import org.apache.jackrabbit.webdav.version.UpdateInfo;import org.apache.jackrabbit.webdav.version.VersionControlledResource;import org.apache.jackrabbit.webdav.version.VersionHistoryResource;import org.apache.jackrabbit.webdav.version.VersionResource;import org.apache.jackrabbit.webdav.version.VersionableResource;import org.apache.jackrabbit.webdav.version.report.ReportType;import org.apache.jackrabbit.webdav.version.report.SupportedReportSetProperty;import org.apache.jackrabbit.webdav.xml.DomUtil;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.w3c.dom.Element;import javax.jcr.Item;import javax.jcr.Node;import javax.jcr.NodeIterator;import javax.jcr.RepositoryException;import javax.jcr.Session;import javax.jcr.Value;import javax.jcr.ValueFormatException;import javax.jcr.observation.EventListener;import javax.jcr.version.Version;import javax.jcr.version.VersionHistory;import java.util.List;import java.util.ArrayList;/** * <code>VersionControlledItemCollection</code> represents a JCR node item and * covers all functionality related to versioning of {@link Node}s. * * @see Node */public class VersionControlledItemCollection extends DefaultItemCollection        implements VersionControlledResource {    private static Logger log = LoggerFactory.getLogger(VersionControlledItemCollection.class);    /**     * Create a new <code>VersionControlledItemCollection</code>.     *     * @param locator     * @param session     */    public VersionControlledItemCollection(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 >---    /**     * Return a comma separated string listing the supported method names.     *     * @return the supported method names.     * @see org.apache.jackrabbit.webdav.DavResource#getSupportedMethods()     */    public String getSupportedMethods() {        StringBuffer sb = new StringBuffer(super.getSupportedMethods());        // Versioning support        sb.append(", ").append(VersionableResource.METHODS);        if (this.isVersionControlled()) {            try {                if (((Node)item).isCheckedOut()) {                    sb.append(", ").append(VersionControlledResource.methods_checkedOut);                } else {                    sb.append(", ").append(VersionControlledResource.methods_checkedIn);                }            } catch (RepositoryException e) {                // should not occur.                log.error(e.getMessage());            }        }        return sb.toString();    }    /**     * @param changeList     * @throws DavException     * @see DefaultItemCollection#alterProperties(org.apache.jackrabbit.webdav.property.DavPropertySet, org.apache.jackrabbit.webdav.property.DavPropertyNameSet)     * for additional description of non-compliant behaviour.     */    public MultiStatusResponse alterProperties(List changeList) throws DavException {        /* first resolve merge conflict since they cannot be handled by           setting property values in jcr (and are persisted immediately).           NOTE: this violates RFC 2518 that requires that proppatch           is processed in the order entries are present in the xml and that           required that no changes must be persisted if any set/remove fails.        */        // TODO: solve violation of RFC 2518        resolveMergeConflict(changeList);        // alter other properties only if merge-conflicts could be handled        return super.alterProperties(changeList);    }    /**     * Resolve one or multiple merge conflicts present on this resource. Please     * note that the 'setProperties' or 'removeProperties' set my contain additional     * resource properties, that need to be changed. Those properties are left     * untouched, whereas the {@link #AUTO_MERGE_SET DAV:auto-merge-set}, is     * removed from the list upon successful resolution of a merge conflict.<br>     * If the removeProperties or setProperties set do not contain the mentioned     * merge conflict resource properties or if the value of those properties do     * not allow for a resolution of an existing merge conflict, this method     * returns silently.     *     * @param changeList     * @throws org.apache.jackrabbit.webdav.DavException     * @see Node#doneMerge(Version)     * @see Node#cancelMerge(Version)     */    private void resolveMergeConflict(List changeList) throws DavException {        if (!exists()) {            throw new DavException(DavServletResponse.SC_NOT_FOUND);        }        try {            Node n = (Node)item;            DavProperty autoMergeSet = null;            DavProperty predecessorSet = null;            /* find DAV:auto-merge-set entries. If none exists no attempt is made               to resolve merge conflict > return silently */            for (int i = 0; i < changeList.size(); i++) {                Object propEntry = changeList.get(i);                // If DAV:auto-merge-set is DavPropertyName all remaining merge                // conflicts are resolved with 'cancel'                if (propEntry instanceof DavPropertyName && AUTO_MERGE_SET.equals(propEntry)) {                    // retrieve the current jcr:mergeFailed property values                    if (!n.hasProperty(JcrConstants.JCR_MERGEFAILED)) {                        throw new DavException(DavServletResponse.SC_CONFLICT, "Attempt to resolve non-existing merge conflicts.");                    }                    Value[] mergeFailed = n.getProperty(JcrConstants.JCR_MERGEFAILED).getValues();                    for (int j = 0; j < mergeFailed.length; j++) {                        n.cancelMerge((Version)getRepositorySession().getNodeByUUID(mergeFailed[j].getString()));                    }                    // remove this entry from the changeList                    changeList.remove(propEntry);                } else if (propEntry instanceof DavProperty) {                    if (AUTO_MERGE_SET.equals(((DavProperty)propEntry).getName())) {                        autoMergeSet = (DavProperty)propEntry;                    } else if (PREDECESSOR_SET.equals(((DavProperty)propEntry).getName())) {                        predecessorSet = (DavProperty)propEntry;                    }                }            }            // If DAV:auto-merge-set is a DavProperty merge conflicts need to be            // resolved individually according to the DAV:predecessor-set property.            if (autoMergeSet != null) {                // retrieve the current jcr:mergeFailed property values                if (!n.hasProperty(JcrConstants.JCR_MERGEFAILED)) {                    throw new DavException(DavServletResponse.SC_CONFLICT, "Attempt to resolve non-existing merge conflicts.");                }                List mergeset = new HrefProperty(autoMergeSet).getHrefs();                List predecSet = (predecessorSet == null) ? new ArrayList() : new HrefProperty(predecessorSet).getHrefs();                Session session = getRepositorySession();                // loop over the mergeFailed values (versions) and test whether they are                // removed from the DAV:auto-merge-set thus indicating resolution.                Value[] mergeFailed = n.getProperty(JcrConstants.JCR_MERGEFAILED).getValues();                for (int i = 0; i < mergeFailed.length; i++) {                    // build version-href from each entry in the jcr:mergeFailed property                    // in order to be able to compare to the entries in the HrefProperty.                    Version version = (Version) session.getNodeByUUID(mergeFailed[i].getString());                    String href = getLocatorFromItem(version).getHref(true);                    // Test if that version has been removed from the merge-set.                    // thus indicating that this merge conflict needs to be resolved.                    if (!mergeset.contains(href)) {                        // If the conflict value has been moved over from DAV:auto-merge-set                        // to the predecessor-set, resolution with 'doneMerge' is                        // appropriate. If the value has been removed from the                        // merge-set but not added to the predecessors 'cancelMerge'                        // must be called.                        if (predecSet.contains(href)) {                            n.doneMerge(version);                        } else {                            n.cancelMerge(version);                        }                    }                }                // after successful resolution of merge-conflicts according to                // DAV:auto-merge-set and DAV:predecessor-set remove these entries                // from the changeList.                changeList.remove(autoMergeSet);                if (predecessorSet != null) {                    changeList.remove(predecessorSet);                }            }        } catch (RepositoryException e) {            throw new JcrDavException(e);        }    }    //--------------------------------------< VersionableResource interface >---    /**     * Adds version control to this resource. If the resource is already under     * version control, this method has no effect.     *     * @throws org.apache.jackrabbit.webdav.DavException if this resource does not     * exist yet or if an error occurs while making the underlying node versionable.     * @see org.apache.jackrabbit.webdav.version.VersionableResource#addVersionControl()     */    public void addVersionControl() throws DavException {        if (!exists()) {            throw new DavException(DavServletResponse.SC_NOT_FOUND);        }        if (!isVersionControlled()) {            try {                ((Node)item).addMixin(JcrConstants.MIX_VERSIONABLE);                item.save();            } catch (RepositoryException e) {                throw new JcrDavException(e);            }        } // else: is already version controlled -> ignore    }    //--------------------------------< VersionControlledResource interface >---    /**     * Calls {@link javax.jcr.Node#checkin()} on the underlying repository node.     *     * @throws org.apache.jackrabbit.webdav.DavException     * @see org.apache.jackrabbit.webdav.version.VersionControlledResource#checkin()     */    public String checkin() throws DavException {        if (!exists()) {            throw new DavException(DavServletResponse.SC_NOT_FOUND);        }        if (!isVersionControlled()) {            throw new DavException(DavServletResponse.SC_METHOD_NOT_ALLOWED);        }        try {            Version v = ((Node) item).checkin();            String versionHref = getLocatorFromItem(v).getHref(true);            return versionHref;        } catch (RepositoryException e) {            // UnsupportedRepositoryException should not occur            throw new JcrDavException(e);        }    }    /**     * Calls {@link javax.jcr.Node#checkout()} on the underlying repository node.     *     * @throws org.apache.jackrabbit.webdav.DavException     * @see org.apache.jackrabbit.webdav.version.VersionControlledResource#checkout()     */    public void checkout() throws DavException {        if (!exists()) {            throw new DavException(DavServletResponse.SC_NOT_FOUND);        }        if (!isVersionControlled()) {            throw new DavException(DavServletResponse.SC_METHOD_NOT_ALLOWED);        }        try {            ((Node) item).checkout();        } catch (RepositoryException e) {            // UnsupportedRepositoryException should not occur            throw new JcrDavException(e);        }    }    /**     * Not implemented. Always throws a <code>DavException</code> with error code     * {@link org.apache.jackrabbit.webdav.DavServletResponse#SC_NOT_IMPLEMENTED}.     *     * @throws org.apache.jackrabbit.webdav.DavException     * @see org.apache.jackrabbit.webdav.version.VersionControlledResource#uncheckout()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -