001 /*
002 * JBoss, Home of Professional Open Source.
003 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004 * as indicated by the @author tags. See the copyright.txt file in the
005 * distribution for a full listing of individual contributors.
006 *
007 * This is free software; you can redistribute it and/or modify it
008 * under the terms of the GNU Lesser General Public License as
009 * published by the Free Software Foundation; either version 2.1 of
010 * the License, or (at your option) any later version.
011 *
012 * This software is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this software; if not, write to the Free
019 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021 */
022 package org.jboss.dna.graph.requests;
023
024 import org.jboss.dna.common.util.CheckArg;
025 import org.jboss.dna.graph.GraphI18n;
026 import org.jboss.dna.graph.Location;
027 import org.jboss.dna.graph.connectors.RepositoryConnection;
028 import org.jboss.dna.graph.properties.Name;
029 import org.jboss.dna.graph.properties.Property;
030
031 /**
032 * Instruction to read a single property on the node at the specified location.
033 *
034 * @author Randall Hauch
035 */
036 public class ReadPropertyRequest extends CacheableRequest {
037
038 private static final long serialVersionUID = 1L;
039
040 private final Location on;
041 private final Name propertyName;
042 private Property property;
043 private Location actualLocation;
044
045 /**
046 * Create a request to read the properties and number of children of a node at the supplied location.
047 *
048 * @param on the location of the node to be read
049 * @param propertyName the name of the property to read
050 * @throws IllegalArgumentException if the location or property name are null
051 */
052 public ReadPropertyRequest( Location on,
053 Name propertyName ) {
054 CheckArg.isNotNull(on, "on");
055 CheckArg.isNotNull(propertyName, "propertyName");
056 this.on = on;
057 this.propertyName = propertyName;
058 }
059
060 /**
061 * {@inheritDoc}
062 *
063 * @see org.jboss.dna.graph.requests.Request#isReadOnly()
064 */
065 @Override
066 public boolean isReadOnly() {
067 return true;
068 }
069
070 /**
071 * Get the location defining the node that is to be read.
072 *
073 * @return the location of the node; never null
074 */
075 public Location on() {
076 return on;
077 }
078
079 /**
080 * Get the name of the property that is to be read
081 *
082 * @return the property name; never null
083 */
084 public Name named() {
085 return propertyName;
086 }
087
088 /**
089 * Get the property that was read.
090 *
091 * @return the property, or null if the property was not read or did not exist on the node
092 */
093 public Property getProperty() {
094 return property;
095 }
096
097 /**
098 * Set the property on the node as read from the {@link RepositoryConnection}
099 *
100 * @param property the property that was read
101 * @throws IllegalArgumentException if the property's name does not match the {@link #named() name of the property} that was
102 * to be read
103 */
104 public void setProperty( Property property ) {
105 if (property != null) CheckArg.isEquals(property.getName(), "property's name", named(), "property name");
106 this.property = property;
107 }
108
109 /**
110 * Sets the actual and complete location of the node whose property has been read. This method must be called when processing
111 * the request, and the actual location must have a {@link Location#getPath() path}.
112 *
113 * @param actual the actual location of the node being read, or null if the {@link #on() current location} should be used
114 * @throws IllegalArgumentException if the actual location does not represent the {@link Location#isSame(Location) same
115 * location} as the {@link #on() current location}, or if the actual location does not have a path.
116 */
117 public void setActualLocationOfNode( Location actual ) {
118 if (!on.isSame(actual)) { // not same if actual is null
119 throw new IllegalArgumentException(GraphI18n.actualLocationIsNotSameAsInputLocation.text(actual, on));
120 }
121 assert actual != null;
122 if (!actual.hasPath()) {
123 throw new IllegalArgumentException(GraphI18n.actualLocationMustHavePath.text(actual));
124 }
125 this.actualLocation = actual;
126 }
127
128 /**
129 * Get the actual location of the node whose property was read.
130 *
131 * @return the actual location, or null if the actual location was not set
132 */
133 public Location getActualLocationOfNode() {
134 return actualLocation;
135 }
136
137 /**
138 * {@inheritDoc}
139 *
140 * @see java.lang.Object#equals(java.lang.Object)
141 */
142 @Override
143 public boolean equals( Object obj ) {
144 if (this.getClass().isInstance(obj)) {
145 ReadPropertyRequest that = (ReadPropertyRequest)obj;
146 if (!this.on().equals(that.on())) return false;
147 if (!this.named().equals(that.named())) return false;
148 return true;
149 }
150 return false;
151 }
152
153 /**
154 * {@inheritDoc}
155 *
156 * @see java.lang.Object#toString()
157 */
158 @Override
159 public String toString() {
160 return "read " + named() + " property at " + on();
161 }
162
163 }