1 /* 2 * ModeShape (http://www.modeshape.org) 3 * See the COPYRIGHT.txt file distributed with this work for information 4 * regarding copyright ownership. Some portions may be licensed 5 * to Red Hat, Inc. under one or more contributor license agreements. 6 * See the AUTHORS.txt file in the distribution for a full listing of 7 * individual contributors. 8 * 9 * ModeShape is free software. Unless otherwise indicated, all code in ModeShape 10 * is licensed to you under the terms of the GNU Lesser General Public License as 11 * published by the Free Software Foundation; either version 2.1 of 12 * the License, or (at your option) any later version. 13 * 14 * ModeShape is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with this software; if not, write to the Free 21 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 22 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 23 */ 24 package org.modeshape.jcr; 25 26 import net.jcip.annotations.Immutable; 27 import org.modeshape.common.util.CheckArg; 28 import org.modeshape.common.util.HashCode; 29 import org.modeshape.graph.property.Path; 30 import org.modeshape.graph.property.basic.BasicPath; 31 32 /** 33 * A correspondence identifier is defined to be the pair of the UUID of the nearest referenceable ancestor and the relative path 34 * from that referenceable ancestor to the node of interest. If any node is a referenceable node, then the correspondence 35 * identifier is just the UUID of the node. Per Section 4.10.2 of JSR-170, version 1.0.1. 36 * <p> 37 * Note that per Section 6.2.8, two non-referenceable nodes are the same if they have the same correspondence identifier. 38 * </p> 39 */ 40 @Immutable 41 class CorrespondenceId { 42 43 private static final Path NO_PATH = BasicPath.SELF_PATH; 44 45 private final String referenceableId; 46 private final Path relativePath; 47 private final int hc; 48 49 public CorrespondenceId( String referenceableId ) { 50 this(referenceableId, NO_PATH); 51 } 52 53 public CorrespondenceId( String referenceableId, 54 Path relativePath ) { 55 CheckArg.isNotNull(referenceableId, "referenceableId"); 56 CheckArg.isNotNull(relativePath, "relativePath"); 57 assert !relativePath.isAbsolute(); 58 this.referenceableId = referenceableId; 59 this.relativePath = relativePath; 60 this.hc = HashCode.compute(this.referenceableId, this.relativePath); 61 } 62 63 /** 64 * @return referenceableId 65 */ 66 public String getReferenceableId() { 67 return referenceableId; 68 } 69 70 /** 71 * @return relativePath 72 */ 73 public Path getRelativePath() { 74 return relativePath; 75 } 76 77 /** 78 * {@inheritDoc} 79 * 80 * @see java.lang.Object#hashCode() 81 */ 82 @Override 83 public int hashCode() { 84 return hc; 85 } 86 87 /** 88 * {@inheritDoc} 89 * 90 * @see java.lang.Object#equals(java.lang.Object) 91 */ 92 @Override 93 public boolean equals( Object obj ) { 94 if (obj == this) return true; 95 if (obj instanceof CorrespondenceId) { 96 CorrespondenceId that = (CorrespondenceId)obj; 97 return this.referenceableId.equals(that.referenceableId) && this.relativePath.equals(that.relativePath); 98 } 99 return false; 100 } 101 102 }