001 /* 002 * JBoss DNA (http://www.jboss.org/dna) 003 * See the COPYRIGHT.txt file distributed with this work for information 004 * regarding copyright ownership. Some portions may be licensed 005 * to Red Hat, Inc. under one or more contributor license agreements. 006 * See the AUTHORS.txt file in the distribution for a full listing of 007 * individual contributors. 008 * 009 * Unless otherwise indicated, all code in JBoss DNA is licensed 010 * to you under the terms of the GNU Lesser General Public License as 011 * published by the Free Software Foundation; either version 2.1 of 012 * the License, or (at your option) any later version. 013 * 014 * JBoss DNA is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 * Lesser General Public License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this software; if not, write to the Free 021 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 022 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 023 */ 024 package org.jboss.dna.jcr.cache; 025 026 import java.util.UUID; 027 import javax.jcr.PropertyType; 028 import net.jcip.annotations.Immutable; 029 import org.jboss.dna.graph.property.Name; 030 import org.jboss.dna.graph.property.Property; 031 import org.jboss.dna.jcr.PropertyDefinitionId; 032 import org.jboss.dna.jcr.PropertyId; 033 034 /** 035 * An immutable representation of the name and current value(s) for a property, along with the JCR metadata for the property, 036 * including the {@link PropertyInfo#getDefinitionId() property definition} and {@link PropertyInfo#getPropertyType() property 037 * type}. 038 * <p> 039 * This class is immutable, which means that clients should never hold onto an instance. Instead, clients can obtain an instance 040 * by using a {@link PropertyId}, quickly use the information in the instance, and then immediately discard their reference. This 041 * is because these instances are replaced and discarded whenever anything about the property changes. 042 * </p> 043 */ 044 @Immutable 045 public class PropertyInfo { 046 private final PropertyId propertyId; 047 private final PropertyDefinitionId definitionId; 048 private final Property dnaProperty; 049 private final int propertyType; 050 private final boolean multiValued; 051 private final boolean isNew; 052 private final boolean isModified; 053 054 public PropertyInfo( PropertyId propertyId, 055 PropertyDefinitionId definitionId, 056 int propertyType, 057 Property dnaProperty, 058 boolean multiValued, 059 boolean isNew, 060 boolean isModified ) { 061 this.propertyId = propertyId; 062 this.definitionId = definitionId; 063 this.propertyType = propertyType; 064 this.dnaProperty = dnaProperty; 065 this.multiValued = multiValued; 066 this.isNew = isNew; 067 this.isModified = isModified; 068 069 assert isNew ? !isModified : true; 070 assert isModified ? !isNew : true; 071 } 072 073 /** 074 * Get the durable identifier for this property. 075 * 076 * @return propertyId 077 */ 078 public PropertyId getPropertyId() { 079 return propertyId; 080 } 081 082 /** 083 * Get the UUID of the node to which this property belongs. 084 * 085 * @return the owner node's UUID; never null 086 */ 087 public UUID getNodeUuid() { 088 return propertyId.getNodeId(); 089 } 090 091 /** 092 * The identifier for the property definition. 093 * 094 * @return the property definition ID; never null 095 */ 096 public PropertyDefinitionId getDefinitionId() { 097 return definitionId; 098 } 099 100 /** 101 * Get the DNA Property, which contains the name and value(s) 102 * 103 * @return the property; never null 104 */ 105 public Property getProperty() { 106 return dnaProperty; 107 } 108 109 /** 110 * Get the property name. 111 * 112 * @return the property name; never null 113 */ 114 public Name getPropertyName() { 115 return dnaProperty.getName(); 116 } 117 118 /** 119 * Get the JCR {@link PropertyType} for this property. 120 * 121 * @return the property type 122 */ 123 public int getPropertyType() { 124 return propertyType; 125 } 126 127 /** 128 * @return multiValued 129 */ 130 public boolean isMultiValued() { 131 return multiValued; 132 } 133 134 /** 135 * Indicates whether this property/value combination is new (i.e., does not yet exist in the persistent repository). 136 * 137 * @return {@code true} if the property has not yet been saved to the persistent repository. 138 * @see javax.jcr.Item#isNew() 139 */ 140 public boolean isNew() { 141 return this.isNew; 142 } 143 144 /** 145 * Indicates whether this property/value combination is modified (i.e., exists in the persistent repository with a different 146 * value or values). 147 * 148 * @return {@code true} if the property has been modified since the last time it was saved to the persistent repository 149 * @see javax.jcr.Item#isModified() 150 */ 151 public boolean isModified() { 152 return this.isModified; 153 } 154 155 /** 156 * {@inheritDoc} 157 * 158 * @see java.lang.Object#hashCode() 159 */ 160 @Override 161 public int hashCode() { 162 return propertyId.hashCode(); 163 } 164 165 /** 166 * {@inheritDoc} 167 * 168 * @see java.lang.Object#equals(java.lang.Object) 169 */ 170 @Override 171 public boolean equals( Object obj ) { 172 if (obj == this) return true; 173 if (obj instanceof PropertyInfo) { 174 return propertyId.equals(((PropertyInfo)obj).getPropertyId()); 175 } 176 return false; 177 } 178 179 /** 180 * {@inheritDoc} 181 * 182 * @see java.lang.Object#toString() 183 */ 184 @Override 185 public String toString() { 186 StringBuilder sb = new StringBuilder(); 187 sb.append(propertyId); 188 sb.append(" defined by ").append(definitionId); 189 sb.append(" of type ").append(PropertyType.nameFromValue(propertyType)); 190 if (dnaProperty.isSingle()) { 191 sb.append(" with value "); 192 } else { 193 sb.append(" with values "); 194 } 195 sb.append(dnaProperty.getValuesAsArray()); 196 return sb.toString(); 197 } 198 }