package ch.x42.terye.store; import java.util.Iterator; import java.util.NavigableMap; import java.util.TreeMap; import javax.jcr.RepositoryException; import ch.x42.terye.ItemImpl; import ch.x42.terye.NodeImpl; import ch.x42.terye.Path; import ch.x42.terye.store.ChangeLog.AddOperation; import ch.x42.terye.store.ChangeLog.ModifyOperation; import ch.x42.terye.store.ChangeLog.Operation; import ch.x42.terye.store.ChangeLog.RemoveOperation; public class ItemStore { private static ItemStore instance; private NavigableMap<String, ItemImpl> items; private ItemStore() { items = new TreeMap<String, ItemImpl>(); // create root node items.put(Path.ROOT, new NodeImpl(null, new Path(Path.ROOT), "rep:root")); } public static synchronized ItemStore getInstance() { if (instance == null) { instance = new ItemStore(); } return instance; } public synchronized ItemImpl load(String id, ItemType type) { ItemImpl item = items.get(id); if (item != null && (type == null || item.getItemType().equals(type))) { return item; } return null; } public synchronized void store(ItemImpl item) throws RepositoryException { items.put(item.getPath(), item); } public synchronized void delete(String id) { // delete the item ItemImpl item = items.remove(id); // if it is a node... if (item == null || !item.isNode()) { return; } // ...delete its descendants Iterator<String> iterator = items.tailMap(id, true).navigableKeySet() .iterator(); while (iterator.hasNext()) { String key = iterator.next(); if (!key.startsWith(id)) { break; } iterator.remove(); } } public synchronized void persist(ChangeLog log) throws RepositoryException { Iterator<Operation> iterator = log.iterator(); while (iterator.hasNext()) { Operation op = iterator.next(); if (op instanceof AddOperation) { store(op.getItem()); } else if (op instanceof ModifyOperation) { store(op.getItem()); } else if (op instanceof RemoveOperation) { delete(op.getItem().getPath()); } } } }