001 /*
002 * Copyright 2011-2012 UnboundID Corp.
003 *
004 * This program is free software; you can redistribute it and/or modify
005 * it under the terms of the GNU General Public License (GPLv2 only)
006 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
007 * as published by the Free Software Foundation.
008 *
009 * This program is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012 * GNU General Public License for more details.
013 *
014 * You should have received a copy of the GNU General Public License
015 * along with this program; if not, see <http://www.gnu.org/licenses>.
016 */
017
018 package com.unboundid.scim.data;
019
020 import com.unboundid.scim.schema.AttributeDescriptor;
021 import com.unboundid.scim.sdk.InvalidResourceException;
022 import com.unboundid.scim.sdk.SCIMAttribute;
023 import com.unboundid.scim.sdk.SCIMAttributeValue;
024
025 import java.net.URI;
026 import java.util.ArrayList;
027 import java.util.Collection;
028 import java.util.Date;
029
030 /**
031 * A complex type containing metadata about the resource.
032 */
033 public class Meta
034 {
035 /**
036 * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
037 * to/from <code>Meta</code> instances.
038 */
039 public static final AttributeValueResolver<Meta> META_RESOLVER =
040 new AttributeValueResolver<Meta>() {
041 /**
042 * {@inheritDoc}
043 */
044 @Override
045 public Meta toInstance(final SCIMAttributeValue value) {
046 String l = value.getSubAttributeValue("location",
047 STRING_RESOLVER);
048 return new Meta(
049 value.getSubAttributeValue("created",
050 DATE_RESOLVER),
051 value.getSubAttributeValue("lastModified",
052 DATE_RESOLVER),
053 l == null ? null : URI.create(l),
054 value.getSubAttributeValue("version",
055 STRING_RESOLVER));
056 }
057
058 /**
059 * {@inheritDoc}
060 */
061 @Override
062 public SCIMAttributeValue fromInstance(
063 final AttributeDescriptor attributeDescriptor,
064 final Meta value) throws InvalidResourceException {
065 Collection<SCIMAttribute> attributes =
066 new ArrayList<SCIMAttribute>(3);
067
068 if(value.created != null)
069 {
070 AttributeDescriptor subAttributeDescriptor =
071 attributeDescriptor.getSubAttribute("created");
072 attributes.add(SCIMAttribute.create(
073 subAttributeDescriptor,
074 SCIMAttributeValue.createDateValue(value.created)));
075 }
076 if(value.lastModified != null)
077 {
078 AttributeDescriptor subAttributeDescriptor =
079 attributeDescriptor.getSubAttribute("lastModified");
080 attributes.add(SCIMAttribute.create(
081 subAttributeDescriptor,
082 SCIMAttributeValue.createDateValue(value.lastModified)));
083 }
084 if(value.location != null)
085 {
086 AttributeDescriptor subAttributeDescriptor =
087 attributeDescriptor.getSubAttribute("location");
088 attributes.add(SCIMAttribute.create(
089 subAttributeDescriptor,
090 SCIMAttributeValue.createStringValue(
091 value.location.toString())));
092 }
093 if(value.version != null)
094 {
095 AttributeDescriptor subAttributeDescriptor =
096 attributeDescriptor.getSubAttribute("version");
097 attributes.add(SCIMAttribute.create(
098 subAttributeDescriptor,
099 SCIMAttributeValue.createStringValue(value.version)));
100 }
101
102 return SCIMAttributeValue.createComplexValue(attributes);
103 }
104 };
105
106 private Date created;
107 private Date lastModified;
108 private URI location;
109 private String version;
110
111 /**
112 * Create an instance of the SCIM meta attribute.
113 *
114 * @param created The time the Resource was added to the
115 * Service Provider.
116 * @param lastModified The most recent time the details of a Resource
117 * were updated at the Service Provider.
118 * @param location The URI of the Resource.
119 * @param version The version of the Resource.
120 */
121 public Meta(final Date created, final Date lastModified, final URI location,
122 final String version) {
123 this.created = created;
124 this.lastModified = lastModified;
125 this.location = location;
126 this.version = version;
127 }
128
129 /**
130 * Retrieves the time the Resource was added to the Service Provider.
131 *
132 * @return The time the Resource was added to the Service Provider.
133 */
134 public Date getCreated() {
135 return created;
136 }
137
138 /**
139 * Sets the time the Resource was added to the Service Provider.
140 *
141 * @param created The time the Resource was added to the Service Provider.
142 */
143 public void setCreated(final Date created) {
144 this.created = created;
145 }
146
147 /**
148 * Retrieves the most recent time the details of a Resource were updated at
149 * the Service Provider.
150 *
151 * @return The most recent time the details of a Resource were updated at
152 * the Service Provider.
153 */
154 public Date getLastModified() {
155 return lastModified;
156 }
157
158 /**
159 * Sets the most recent time the details of a Resource were updated at
160 * the Service Provider.
161 *
162 * @param lastModified The most recent time the details of a Resource were
163 * updated at the Service Provider.
164 */
165 public void setLastModified(final Date lastModified) {
166 this.lastModified = lastModified;
167 }
168
169 /**
170 * Retrieves the URI of the Resource.
171 *
172 * @return The URI of the Resource.
173 */
174 public URI getLocation() {
175 return location;
176 }
177
178 /**
179 * Sets the URI of the Resource.
180 *
181 * @param location The URI of the Resource.
182 */
183 public void setLocation(final URI location) {
184 this.location = location;
185 }
186
187 /**
188 * Retrieves the version of the Resource.
189 *
190 * @return The version of the Resource.
191 */
192 public String getVersion() {
193 return version;
194 }
195
196 /**
197 * Sets the version of the Resource being returned.
198 *
199 * @param version The version of the Resource being returned.
200 */
201 public void setVersion(final String version) {
202 this.version = version;
203 }
204
205 /**
206 * {@inheritDoc}
207 */
208 @Override
209 public boolean equals(final Object o) {
210 if (this == o) {
211 return true;
212 }
213 if (o == null || getClass() != o.getClass()) {
214 return false;
215 }
216
217 Meta meta = (Meta) o;
218
219 if (created != null ? !created.equals(meta.created) :
220 meta.created != null) {
221 return false;
222 }
223 if (lastModified != null ? !lastModified.equals(meta.lastModified) :
224 meta.lastModified != null) {
225 return false;
226 }
227 if (location != null ? !location.equals(meta.location) :
228 meta.location != null) {
229 return false;
230 }
231 if (version != null ? !version.equals(meta.version) :
232 meta.version != null) {
233 return false;
234 }
235
236 return true;
237 }
238
239 /**
240 * {@inheritDoc}
241 */
242 @Override
243 public int hashCode() {
244 int result = created != null ? created.hashCode() : 0;
245 result = 31 * result + (lastModified != null ? lastModified.hashCode() : 0);
246 result = 31 * result + (location != null ? location.hashCode() : 0);
247 result = 31 * result + (version != null ? version.hashCode() : 0);
248 return result;
249 }
250
251 /**
252 * {@inheritDoc}
253 */
254 @Override
255 public String toString() {
256 return "Meta{" +
257 "created=" + created +
258 ", lastModified=" + lastModified +
259 ", location=" + location +
260 ", version='" + version + '\'' +
261 '}';
262 }
263 }