Index: oak-mk/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP <+>/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.apache.jackrabbit.mk.store;\n\nimport org.apache.jackrabbit.mk.model.ChildNodeEntry;\nimport org.apache.jackrabbit.mk.model.Id;\nimport org.apache.jackrabbit.mk.model.StoredNode;\nimport org.apache.jackrabbit.mk.model.tree.AbstractChildNode;\nimport org.apache.jackrabbit.mk.model.tree.AbstractNodeState;\nimport org.apache.jackrabbit.mk.model.tree.AbstractPropertyState;\nimport org.apache.jackrabbit.mk.model.tree.ChildNode;\nimport org.apache.jackrabbit.mk.model.tree.NodeState;\nimport org.apache.jackrabbit.mk.model.tree.PropertyState;\n\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.Map;\n\nclass StoredNodeAsState extends AbstractNodeState {\n\n final StoredNode node;\n\n final RevisionProvider provider;\n\n public StoredNodeAsState(StoredNode node, RevisionProvider provider) {\n this.node = node;\n this.provider = provider;\n }\n\n Id getId() {\n return node.getId();\n }\n\n StoredNode unwrap() {\n return node;\n }\n\n private static class SimplePropertyState extends AbstractPropertyState {\n private final String name;\n private final String value;\n\n // todo make name and value not nullable\n public SimplePropertyState(String name, String value) {\n this.name = name;\n this.value = value;\n }\n\n @Override\n public String getName() {\n return name;\n }\n\n @Override\n public String getEncodedValue() {\n return value;\n }\n\n }\n\n @Override\n public PropertyState getProperty(String name) {\n String value = node.getProperties().get(name);\n if (value != null) {\n return new SimplePropertyState(name, value);\n } else {\n return null;\n }\n }\n\n @Override\n public long getPropertyCount() {\n return node.getProperties().size();\n }\n\n @Override\n public Iterable getProperties() {\n return new Iterable() {\n @Override\n public Iterator iterator() {\n final Iterator> iterator =\n node.getProperties().entrySet().iterator();\n return new Iterator() {\n @Override\n public boolean hasNext() {\n return iterator.hasNext();\n }\n @Override\n public PropertyState next() {\n Map.Entry entry = iterator.next();\n return new SimplePropertyState(\n entry.getKey(), entry.getValue());\n }\n @Override\n public void remove() {\n throw new UnsupportedOperationException();\n }\n };\n }\n };\n }\n\n @Override\n public NodeState getChildNode(String name) {\n ChildNodeEntry entry = node.getChildNodeEntry(name);\n if (entry != null) {\n return getChildNodeEntry(entry).getNode();\n } else {\n return null;\n }\n }\n\n @Override\n public long getChildNodeCount() {\n return node.getChildNodeCount();\n }\n\n @Override\n public Iterable getChildNodeEntries(\n final long offset, final int count) {\n if (count < -1) {\n throw new IllegalArgumentException(\"Illegal count: \" + count);\n } else if (offset > Integer.MAX_VALUE) {\n return Collections.emptyList();\n } else {\n return new Iterable() {\n @Override\n public Iterator iterator() {\n final Iterator iterator =\n node.getChildNodeEntries((int) offset, count);\n return new Iterator() {\n @Override\n public boolean hasNext() {\n return iterator.hasNext();\n }\n @Override\n public ChildNode next() {\n return getChildNodeEntry(iterator.next());\n }\n @Override\n public void remove() {\n throw new UnsupportedOperationException();\n }\n };\n }\n };\n }\n }\n\n ChildNode getChildNodeEntry(\n final ChildNodeEntry entry) {\n return new AbstractChildNode() {\n @Override\n public String getName() {\n return entry.getName();\n }\n @Override\n public NodeState getNode() {\n try {\n StoredNode child = provider.getNode(entry.getId());\n return new StoredNodeAsState(child, provider);\n } catch (Exception e) {\n throw new RuntimeException(\"Unexpected error\", e);\n }\n }\n };\n }\n\n @Override\n public boolean equals(Object that) {\n if (that instanceof StoredNodeAsState) {\n StoredNodeAsState other = (StoredNodeAsState) that;\n return node.getId().equals(other.node.getId());\n }\n return super.equals(that);\n }\n\n}\n =================================================================== --- oak-mk/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java (revision 5d87b4d4d818ab2c6604e7a81ce25d283d44b943) +++ oak-mk/src/main/java/org/apache/jackrabbit/mk/store/StoredNodeAsState.java (revision ) @@ -16,6 +16,10 @@ */ package org.apache.jackrabbit.mk.store; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; + import org.apache.jackrabbit.mk.model.ChildNodeEntry; import org.apache.jackrabbit.mk.model.Id; import org.apache.jackrabbit.mk.model.StoredNode; @@ -26,10 +30,6 @@ import org.apache.jackrabbit.mk.model.tree.NodeState; import org.apache.jackrabbit.mk.model.tree.PropertyState; -import java.util.Collections; -import java.util.Iterator; -import java.util.Map; - class StoredNodeAsState extends AbstractNodeState { final StoredNode node; @@ -188,4 +188,8 @@ return super.equals(that); } + @Override + public int hashCode() { + return this.getId().hashCode(); + } }