propinfo.java

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

JAVA
228
字号
/* * 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.xml;import javax.jcr.ItemExistsException;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.Value;import javax.jcr.ValueFormatException;import javax.jcr.nodetype.ConstraintViolationException;import org.apache.jackrabbit.core.BatchedItemOperations;import org.apache.jackrabbit.core.NodeImpl;import org.apache.jackrabbit.core.PropertyId;import org.apache.jackrabbit.core.nodetype.EffectiveNodeType;import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;import org.apache.jackrabbit.core.nodetype.PropDef;import org.apache.jackrabbit.core.state.NodeState;import org.apache.jackrabbit.core.state.PropertyState;import org.apache.jackrabbit.core.util.ReferenceChangeTracker;import org.apache.jackrabbit.core.value.InternalValue;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.QName;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * Information about a property being imported. This class is used * by the XML import handlers to pass the parsed property information * through the {@link Importer} interface to the actual import process. * <p> * In addition to carrying the actual property data, instances of this * class also know how to apply that data when imported either to a * {@link NodeImpl} instance through a session or directly to a * {@link NodeState} instance in a workspace. */public class PropInfo {    /**     * Logger instance.     */    private static Logger log = LoggerFactory.getLogger(PropInfo.class);    /**     * Name of the property being imported.     */    private final QName name;    /**     * Type of the property being imported.     */    private final int type;    /**     * Value(s) of the property being imported.     */    private final TextValue[] values;    /**     * Creates a proprety information instance.     *     * @param name name of the property being imported     * @param type type of the property being imported     * @param values value(s) of the property being imported     */    public PropInfo(QName name, int type, TextValue[] values) {        this.name = name;        this.type = type;        this.values = values;    }    /**     * Disposes all values contained in this property.     */    public void dispose() {        for (int i = 0; i < values.length; i++) {            values[i].dispose();        }    }    private int getTargetType(PropDef def) {        int target = def.getRequiredType();        if (target != PropertyType.UNDEFINED) {            return target;        } else if (type != PropertyType.UNDEFINED) {            return type;        } else {            return PropertyType.STRING;        }    }    private PropDef getApplicablePropertyDef(EffectiveNodeType ent)            throws ConstraintViolationException {        if (values.length == 1) {            // could be single- or multi-valued (n == 1)            return ent.getApplicablePropertyDef(name, type);        } else {            // can only be multi-valued (n == 0 || n > 1)            return ent.getApplicablePropertyDef(name, type, true);        }    }    public void apply(            NodeImpl node, NamespaceResolver resolver,            ReferenceChangeTracker refTracker) throws RepositoryException {        // find applicable definition        PropDef def = getApplicablePropertyDef(node.getEffectiveNodeType());        if (def.isProtected()) {            // skip protected property            log.debug("skipping protected property " + name);            return;        }        // convert serialized values to Value objects        Value[] va = new Value[values.length];        int targetType = getTargetType(def);        for (int i = 0; i < values.length; i++) {            va[i] = values[i].getValue(targetType, resolver);        }        // multi- or single-valued property?        if (va.length == 1 && !def.isMultiple()) {            Exception e = null;            try {                // set single-value                node.setProperty(name, va[0]);            } catch (ValueFormatException vfe) {                e = vfe;            } catch (ConstraintViolationException cve) {                e = cve;            }            if (e != null) {                // setting single-value failed, try setting value array                // as a last resort (in case there are ambiguous property                // definitions)                node.setProperty(name, va, type);            }        } else {            // can only be multi-valued (n == 0 || n > 1)            node.setProperty(name, va, type);        }        if (type == PropertyType.REFERENCE) {            // store reference for later resolution            refTracker.processedReference(node.getProperty(name));        }    }    public void apply(            NodeState node, BatchedItemOperations itemOps,            NodeTypeRegistry ntReg, ReferenceChangeTracker refTracker)            throws RepositoryException {        PropertyState prop = null;        PropDef def = null;        if (node.hasPropertyName(name)) {            // a property with that name already exists...            PropertyId idExisting = new PropertyId(node.getNodeId(), name);            prop = (PropertyState) itemOps.getItemState(idExisting);            def = ntReg.getPropDef(prop.getDefinitionId());            if (def.isProtected()) {                // skip protected property                log.debug("skipping protected property "                        + itemOps.safeGetJCRPath(idExisting));                return;            }            if (!def.isAutoCreated()                    || (prop.getType() != type && type != PropertyType.UNDEFINED)                    || def.isMultiple() != prop.isMultiValued()) {                throw new ItemExistsException(itemOps.safeGetJCRPath(prop.getPropertyId()));            }        } else {            // there's no property with that name,            // find applicable definition            def = getApplicablePropertyDef(itemOps.getEffectiveNodeType(node));            if (def.isProtected()) {                // skip protected property                log.debug("skipping protected property " + name);                return;            }            // create new property            prop = itemOps.createPropertyState(node, name, type, def);        }        // check multi-valued characteristic        if (values.length != 1 && !def.isMultiple()) {            throw new ConstraintViolationException(itemOps.safeGetJCRPath(prop.getPropertyId())                    + " is not multi-valued");        }        // convert serialized values to InternalValue objects        int targetType = getTargetType(def);        InternalValue[] iva = new InternalValue[values.length];        for (int i = 0; i < values.length; i++) {            iva[i] = values[i].getInternalValue(targetType);        }        // set values        prop.setValues(iva);        // make sure property is valid according to its definition        itemOps.validate(prop);        if (prop.getType() == PropertyType.REFERENCE) {            // store reference for later resolution            refTracker.processedReference(prop);        }        // store property        itemOps.store(prop);    }}

⌨️ 快捷键说明

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