/* * 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.jcr2spi; import org.apache.jackrabbit.spi.ChildInfo; import org.apache.jackrabbit.spi.ItemId; import org.apache.jackrabbit.spi.ItemInfo; import org.apache.jackrabbit.spi.NodeId; import org.apache.jackrabbit.spi.NodeInfo; import org.apache.jackrabbit.spi.PropertyId; import org.apache.jackrabbit.spi.PropertyInfo; import org.apache.jackrabbit.spi.RepositoryService; import org.apache.jackrabbit.spi.commons.iterator.Iterators; import javax.jcr.ItemNotFoundException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * In memory store for {@link ItemInfo}s. */ public class ItemInfoStore { private final Map<ItemId, ItemInfo>infos = new HashMap<ItemId, ItemInfo>(); private final Map<ItemId, Collection<ItemInfo>> batches = new HashMap<ItemId, Collection<ItemInfo>>(); private final Map<ItemId, Collection<ChildInfo>> childInfos = new HashMap<ItemId, Collection<ChildInfo>>(); /** * Retrieve an item by its <code>id</code>. * @param id * @return * @throws ItemNotFoundException if no such item exists */ public ItemInfo getItemInfo(ItemId id) throws ItemNotFoundException { ItemInfo itemInfo = infos.get(id); return itemInfo == null ? ItemInfoStore.<ItemInfo>notFound(id) : itemInfo; } /** * Retrieve an iterator over all items * @return */ public Iterator<ItemInfo> getItemInfos() { return infos.values().iterator(); } /** * Retrieve a node by its <code>id</code>. * * @param id * @return * @throws ItemNotFoundException if no such node exists */ public NodeInfo getNodeInfo(NodeId id) throws ItemNotFoundException { ItemInfo itemInfo = getItemInfo(id); return itemInfo.denotesNode() ? (NodeInfo) itemInfo : ItemInfoStore.<NodeInfo>notFound(id); } /** * Retrieve a property by its <code>id</code>. * * @param id * @return * @throws ItemNotFoundException if no such property exists */ public PropertyInfo getPropertyInfo(PropertyId id) throws ItemNotFoundException { ItemInfo itemInfo = getItemInfo(id); return itemInfo.denotesNode() ? ItemInfoStore.<PropertyInfo>notFound(id) : (PropertyInfo) itemInfo; } /** * Retrieve all items of a batch * @see RepositoryService#getItemInfos(org.apache.jackrabbit.spi.SessionInfo, NodeId) * * @param id * @return */ public Iterator<? extends ItemInfo> getBatch(ItemId id) { Iterable<ItemInfo> batch = batches.get(id); return batch == null ? Iterators.<ItemInfo>empty() : batch.iterator(); } /** * Retrieve the {@link ChildInfo}s of a node * * @param id * @return * @throws ItemNotFoundException if no such node exists */ public Iterator<ChildInfo> getChildInfos(NodeId id) throws ItemNotFoundException { Iterable<ChildInfo> childs = childInfos.get(id); return childs == null ? ItemInfoStore.<Iterator<ChildInfo>>notFound(id) : childs.iterator(); } /** * Add an {@link ItemInfo} * * @param info */ public void addItemInfo(ItemInfo info) { infos.put(info.getId(), info); } /** * Add a {@link ItemInfo} to a batch * * @param id * @param info */ public void updateBatch(ItemId id, ItemInfo info) { if (!batches.containsKey(id)) { batches.put(id, new ArrayList<ItemInfo>()); } batches.get(id).add(info); } /** * Add a {@link ChildInfo} to a node * @param id * @param info */ public void updateChilds(ItemId id, ChildInfo info) { if (!childInfos.containsKey(id)) { childInfos.put(id, new ArrayList<ChildInfo>()); } childInfos.get(id).add(info); } /** * Set the {@link ChildInfo}s of a node * * @param id * @param infos */ public void setChildInfos(NodeId id, Iterator<ChildInfo> infos) { childInfos.put(id, toList(infos)); } // -----------------------------------------------------< private >--- private static <T> T notFound(ItemId itemId) throws ItemNotFoundException { throw new ItemNotFoundException(itemId.toString()); } private static <T> List<T> toList(Iterator<T> infos) { List<T> list = new ArrayList<T>(); while (infos.hasNext()) { list.add(infos.next()); } return list; } }