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    }