abstractvisprovider.java
来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 499 行 · 第 1/2 页
JAVA
499 行
* {@inheritDoc} */ public VirtualPropertyState createPropertyState(VirtualNodeState parent, QName name, int type, boolean multiValued) throws RepositoryException { PropDef def = getApplicablePropertyDef(parent, name, type, multiValued); PropertyId id = new PropertyId(parent.getNodeId(), name); VirtualPropertyState prop = new VirtualPropertyState(id); prop.setType(type); prop.setMultiValued(multiValued); prop.setDefinitionId(def.getId()); return prop; } /** * {@inheritDoc} */ public VirtualNodeState createNodeState(VirtualNodeState parent, QName name, NodeId id, QName nodeTypeName) throws RepositoryException { NodeDefId def; try { def = getApplicableChildNodeDef(parent, name, nodeTypeName).getId(); } catch (RepositoryException re) { // hack, use nt:unstructured as parent NodeTypeRegistry ntReg = getNodeTypeRegistry(); EffectiveNodeType ent = ntReg.getEffectiveNodeType(QName.NT_UNSTRUCTURED); NodeDef cnd = ent.getApplicableChildNodeDef(name, nodeTypeName, ntReg); ntReg.getNodeDef(cnd.getId()); def = cnd.getId(); } // create a new node state VirtualNodeState state; if (id == null) { id = new NodeId(UUID.randomUUID()); } state = new VirtualNodeState(this, parent.getNodeId(), id, nodeTypeName, new QName[0]); state.setDefinitionId(def); cache(state); return state; } /** * {@inheritDoc} */ public void addListener(ItemStateListener listener) { synchronized (listeners) { assert (!listeners.contains(listener)); listeners.add(listener); } } /** * {@inheritDoc} */ public void removeListener(ItemStateListener listener) { synchronized (listeners) { listeners.remove(listener); } } /** * returns the node type manager * * @return the node type manager */ protected NodeTypeRegistry getNodeTypeRegistry() { return ntReg; } /** * adds the node state to the cache * * @param state */ protected NodeState cache(NodeState state) { if (state != null) { nodes.put(state); log.debug("item added to cache. size=" + nodes.size()); } return state; } /** * removes the node state from the cache * * @param id */ protected void evict(NodeId id) { nodes.remove(id); } /** * invalidates the item * * @param id */ public void invalidateItem(ItemId id, boolean recursive) { VirtualNodeState state = id.equals(rootNodeId) ? root : (VirtualNodeState) nodes.get(id); if (state != null) { if (recursive) { VirtualPropertyState[] props = state.getProperties(); for (int i = 0; i < props.length; i++) { props[i].notifyStateUpdated(); } Iterator iter = state.getChildNodeEntries().iterator(); while (iter.hasNext()) { NodeState.ChildNodeEntry pe = (NodeState.ChildNodeEntry) iter.next(); invalidateItem(pe.getId(), true); } } state.notifyStateUpdated(); } } /** * retrieves the property definition for the given contraints * * @param propertyName * @param type * @param multiValued * @return * @throws RepositoryException */ protected PropDef getApplicablePropertyDef(NodeState parent, QName propertyName, int type, boolean multiValued) throws RepositoryException { return getEffectiveNodeType(parent).getApplicablePropertyDef(propertyName, type, multiValued); } /** * Retrieves the node definition for the given contraints. * * @param nodeName * @param nodeTypeName * @return * @throws RepositoryException */ protected NodeDef getApplicableChildNodeDef(NodeState parent, QName nodeName, QName nodeTypeName) throws RepositoryException { return getEffectiveNodeType(parent).getApplicableChildNodeDef( nodeName, nodeTypeName, getNodeTypeRegistry()); } /** * Returns the effective (i.e. merged and resolved) node type representation * of this node's primary and mixin node types. * * @return the effective node type * @throws RepositoryException */ protected EffectiveNodeType getEffectiveNodeType(NodeState parent) throws RepositoryException { // build effective node type of mixins & primary type NodeTypeRegistry ntReg = getNodeTypeRegistry(); // existing mixin's HashSet set = new HashSet(parent.getMixinTypeNames()); // primary type set.add(parent.getNodeTypeName()); try { return ntReg.getEffectiveNodeType((QName[]) set.toArray(new QName[set.size()])); } catch (NodeTypeConflictException ntce) { String msg = "internal error: failed to build effective node type for node " + parent.getNodeId(); throw new RepositoryException(msg, ntce); } } /** * {@inheritDoc} */ public void stateCreated(ItemState created) { ItemStateListener[] la; synchronized (listeners) { la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]); } for (int i = 0; i < la.length; i++) { if (la[i] != null) { la[i].stateCreated(created); } } } /** * {@inheritDoc} */ public void stateModified(ItemState modified) { ItemStateListener[] la; synchronized (listeners) { la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]); } for (int i = 0; i < la.length; i++) { if (la[i] != null) { la[i].stateModified(modified); } } } /** * {@inheritDoc} */ public void stateDestroyed(ItemState destroyed) { if (destroyed.isNode() && destroyed.getId().equals(rootNodeId)) { try { root = createRootNodeState(); } catch (RepositoryException e) { // ignore } } evict((NodeId) destroyed.getId()); ItemStateListener[] la; synchronized (listeners) { la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]); } for (int i = 0; i < la.length; i++) { if (la[i] != null) { la[i].stateDestroyed(destroyed); } } } /** * {@inheritDoc} */ public void stateDiscarded(ItemState discarded) { if (discarded.isNode() && discarded.getId().equals(rootNodeId)) { try { root = createRootNodeState(); } catch (RepositoryException e) { // ignore } } evict((NodeId) discarded.getId()); ItemStateListener[] la; synchronized (listeners) { la = (ItemStateListener[]) listeners.toArray(new ItemStateListener[listeners.size()]); } for (int i = 0; i < la.length; i++) { if (la[i] != null) { la[i].stateDiscarded(discarded); } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?