internalfrozennodeimpl.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 356 行

JAVA
356
字号
/* * 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.core.version;import org.apache.jackrabbit.core.NodeImpl;import org.apache.jackrabbit.core.PropertyImpl;import org.apache.jackrabbit.core.NodeId;import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;import org.apache.jackrabbit.core.state.ItemStateException;import org.apache.jackrabbit.core.state.NodeState;import org.apache.jackrabbit.core.state.PropertyState;import org.apache.jackrabbit.core.value.InternalValue;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.uuid.UUID;import javax.jcr.NodeIterator;import javax.jcr.PropertyIterator;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.nodetype.NodeType;import javax.jcr.version.OnParentVersionAction;import javax.jcr.version.VersionException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/** * Implements a <code>InternalFrozenNode</code> */class InternalFrozenNodeImpl extends InternalFreezeImpl        implements InternalFrozenNode {    /**     * checkin mode version.     */    private static final int MODE_VERSION = 0;    /**     * checkin mode copy. specifies, that the items are always copied.     */    private static final int MODE_COPY = 1;    /**     * mode flag specifies, that the mode should be recursed. otherwise i     * will be redetermined by the opv.     */    private static final int MODE_COPY_RECURSIVE = 3;    /**     * the list of frozen properties     */    private PropertyState[] frozenProperties;    /**     * the frozen child nodes     */    private InternalFreeze[] frozenNodes = null;    /**     * the frozen uuid of the original node     */    private UUID frozenUUID = null;    /**     * the frozen primary type of the orginal node     */    private QName frozenPrimaryType = null;    /**     * the frozen list of mixin types of the original node     */    private QName[] frozenMixinTypes = null;    /**     * Creates a new frozen node based on the given persistance node.     *     * @param node     * @throws javax.jcr.RepositoryException     */    public InternalFrozenNodeImpl(AbstractVersionManager vMgr, NodeStateEx node,                                  InternalVersionItem parent)            throws RepositoryException {        super(vMgr, node, parent);        // init the frozen properties        PropertyState[] props;        try {            props = node.getProperties();        } catch (ItemStateException e) {            throw new RepositoryException(e);        }        List propList = new ArrayList();        for (int i = 0; i < props.length; i++) {            PropertyState prop = props[i];            if (prop.getName().equals(QName.JCR_FROZENUUID)) {                // special property                frozenUUID = UUID.fromString(node.getPropertyValue(QName.JCR_FROZENUUID).internalValue().toString());            } else if (prop.getName().equals(QName.JCR_FROZENPRIMARYTYPE)) {                // special property                frozenPrimaryType = (QName) node.getPropertyValue(QName.JCR_FROZENPRIMARYTYPE).internalValue();            } else if (prop.getName().equals(QName.JCR_FROZENMIXINTYPES)) {                // special property                InternalValue[] values = node.getPropertyValues(QName.JCR_FROZENMIXINTYPES);                if (values == null) {                    frozenMixinTypes = new QName[0];                } else {                    frozenMixinTypes = new QName[values.length];                    for (int j = 0; j < values.length; j++) {                        frozenMixinTypes[j] = (QName) values[j].internalValue();                    }                }            } else if (prop.getName().equals(QName.JCR_PRIMARYTYPE)) {                // ignore            } else if (prop.getName().equals(QName.JCR_UUID)) {                // ignore            } else {                propList.add(prop);            }        }        frozenProperties = (PropertyState[]) propList.toArray(new PropertyState[propList.size()]);        // do some checks        if (frozenMixinTypes == null) {            frozenMixinTypes = new QName[0];        }        if (frozenPrimaryType == null) {            throw new RepositoryException("Illegal frozen node. Must have 'frozenPrimaryType'");        }    }    /**     * {@inheritDoc}     */    public QName getName() {        return node.getName();    }    /**     * {@inheritDoc}     */    public NodeId getId() {        return node.getNodeId();    }    /**     * {@inheritDoc}     */    public synchronized InternalFreeze[] getFrozenChildNodes()            throws VersionException {        if (frozenNodes == null) {            try {                // maybe add iterator?                List entries = node.getState().getChildNodeEntries();                frozenNodes = new InternalFreeze[entries.size()];                Iterator iter = entries.iterator();                int i = 0;                while (iter.hasNext()) {                    NodeState.ChildNodeEntry entry =                            (NodeState.ChildNodeEntry) iter.next();                    frozenNodes[i++] = (InternalFreeze) vMgr.getItem(entry.getId());                }            } catch (RepositoryException e) {                throw new VersionException("Unable to retrieve frozen child nodes", e);            }        }        return frozenNodes;    }    /**     * {@inheritDoc}     */    public boolean hasFrozenHistory(UUID uuid) {        try {            NodeId id = new NodeId(uuid);            InternalFreeze[] frozen = getFrozenChildNodes();            for (int i=0; i<frozen.length; i++) {                if (frozen[i] instanceof InternalFrozenVersionHistory &&                    ((InternalFrozenVersionHistory) frozen[i])                            .getVersionHistoryId().equals(id)) {                    return true;                }            }        } catch (RepositoryException e) {            // ignore        }        return false;    }    /**     * {@inheritDoc}     */    public PropertyState[] getFrozenProperties() {        return frozenProperties;    }    /**     * {@inheritDoc}     */    public UUID getFrozenUUID() {        return frozenUUID;    }    /**     * {@inheritDoc}     */    public QName getFrozenPrimaryType() {        return frozenPrimaryType;    }    /**     * {@inheritDoc}     */    public QName[] getFrozenMixinTypes() {        return frozenMixinTypes;    }    /**     * Checks-in a <code>src</code> node. It creates a new child node of     * <code>parent</code> with the given <code>name</code> and adds the     * source nodes properties according to their OPV value to the     * list of frozen properties. It creates frozen child nodes for each child     * node of <code>src</code> according to its OPV value.     *     * @param parent     * @param name     * @param src     * @return     * @throws RepositoryException     */    protected static NodeStateEx checkin(NodeStateEx parent, QName name,                                         NodeImpl src)            throws RepositoryException {        return checkin(parent, name, src, MODE_VERSION);    }    /**     * Checks-in a <code>src</code> node. It creates a new child node of     * <code>parent</code> with the given <code>name</code> and adds the     * source nodes properties according to their OPV value to the     * list of frozen properties. It creates frozen child nodes for each child     * node of <code>src</code> according to its OPV value.     *     * @param parent     * @param name     * @param src     * @return     * @throws RepositoryException     */    private static NodeStateEx checkin(NodeStateEx parent, QName name,                                       NodeImpl src, int mode)            throws RepositoryException {        // create new node        NodeStateEx node = parent.addNode(name, QName.NT_FROZENNODE, null, true);        // initialize the internal properties        node.setPropertyValue(QName.JCR_FROZENUUID,                InternalValue.create(src.internalGetUUID().toString()));        node.setPropertyValue(QName.JCR_FROZENPRIMARYTYPE,                InternalValue.create(((NodeTypeImpl) src.getPrimaryNodeType()).getQName()));        if (src.hasProperty(QName.JCR_MIXINTYPES)) {            NodeType[] mixins = src.getMixinNodeTypes();            InternalValue[] ivalues = new InternalValue[mixins.length];            for (int i = 0; i < mixins.length; i++) {                ivalues[i] = InternalValue.create(((NodeTypeImpl) mixins[i]).getQName());            }            node.setPropertyValues(QName.JCR_FROZENMIXINTYPES, PropertyType.NAME, ivalues);        }        // add the properties        PropertyIterator piter = src.getProperties();        while (piter.hasNext()) {            PropertyImpl prop = (PropertyImpl) piter.nextProperty();            int opv;            if ((mode & MODE_COPY) > 0) {                opv = OnParentVersionAction.COPY;            } else {                opv = prop.getDefinition().getOnParentVersion();            }            switch (opv) {                case OnParentVersionAction.ABORT:                    parent.reload();                    throw new VersionException("Checkin aborted due to OPV in " + prop.safeGetJCRPath());                case OnParentVersionAction.COMPUTE:                case OnParentVersionAction.IGNORE:                case OnParentVersionAction.INITIALIZE:                    break;                case OnParentVersionAction.VERSION:                case OnParentVersionAction.COPY:                    // ignore frozen properties                    if (!prop.getQName().equals(QName.JCR_PRIMARYTYPE)                            && !prop.getQName().equals(QName.JCR_MIXINTYPES)                            && !prop.getQName().equals(QName.JCR_UUID)) {                        node.copyFrom(prop);                    }                    break;            }        }        // add the frozen children and histories        NodeIterator niter = src.getNodes();        while (niter.hasNext()) {            NodeImpl child = (NodeImpl) niter.nextNode();            int opv;            if ((mode & MODE_COPY_RECURSIVE) > 0) {                opv = OnParentVersionAction.COPY;            } else {                opv = child.getDefinition().getOnParentVersion();            }            switch (opv) {                case OnParentVersionAction.ABORT:                    throw new VersionException("Checkin aborted due to OPV in " + child.safeGetJCRPath());                case OnParentVersionAction.COMPUTE:                case OnParentVersionAction.IGNORE:                case OnParentVersionAction.INITIALIZE:                    break;                case OnParentVersionAction.VERSION:                    if (child.isNodeType(QName.MIX_VERSIONABLE)) {                        // create frozen versionable child                        NodeStateEx newChild = node.addNode(child.getQName(), QName.NT_VERSIONEDCHILD, null, false);                        newChild.setPropertyValue(QName.JCR_CHILDVERSIONHISTORY,                                InternalValue.create(new UUID(child.getVersionHistory().getUUID())));                        /*                        newChild.setPropertyValue(JCR_BASEVERSION,                                InternalValue.create(child.getBaseVersion().getUUID()));                        */                        break;                    }                    // else copy but do not recurse                    checkin(node, child.getQName(), child, MODE_COPY);                    break;                case OnParentVersionAction.COPY:                    checkin(node, child.getQName(), child, MODE_COPY_RECURSIVE);                    break;            }        }        return node;    }}

⌨️ 快捷键说明

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