001/*
002 * Copyright 2011-2013 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
018package com.unboundid.scim.data;
019
020import com.unboundid.scim.schema.AttributeDescriptor;
021import com.unboundid.scim.sdk.InvalidResourceException;
022import com.unboundid.scim.sdk.SCIMAttributeValue;
023
024import java.util.Date;
025
026/**
027 * Used to resolve SCIM attribute values to Java instances.
028 *
029 * @param <T> The Java class to resolve.
030 */
031public abstract class AttributeValueResolver<T>
032{
033  /**
034   * Create an instance from the given attribute value.
035   *
036   * @param value The value to create an instance from.
037   * @return The instance created from the attribute value.
038   */
039  public abstract T toInstance(final SCIMAttributeValue value);
040
041  /**
042   * Create a SCIM attribute value from the given instance.
043   *
044   * @param attributeDescriptor The descriptor for the attribute to create.
045   * @param value The instance.
046   * @return The SCIM attribute value created from the instance.
047   * @throws InvalidResourceException if the value violates the schema.
048   */
049  public abstract SCIMAttributeValue fromInstance(
050      final AttributeDescriptor attributeDescriptor, final T value)
051      throws InvalidResourceException;
052
053  /**
054   * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
055   * to/from <code>String</code> instances.
056   */
057  public static final AttributeValueResolver<String> STRING_RESOLVER =
058      new AttributeValueResolver<String>() {
059
060        /**
061         * {@inheritDoc}
062         */
063        public String toInstance(final SCIMAttributeValue value) {
064          return value.getStringValue();
065        }
066
067        /**
068         * {@inheritDoc}
069         */
070        public SCIMAttributeValue fromInstance(
071            final AttributeDescriptor attributeDescriptor, final String value) {
072          return SCIMAttributeValue.createStringValue(value);
073        }
074      };
075
076
077  /**
078   * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
079   * to/from <code>String</code> instances.
080   */
081  public static final AttributeValueResolver<Date> DATE_RESOLVER =
082      new AttributeValueResolver<Date>() {
083        /**
084         * {@inheritDoc}
085         */
086        public Date toInstance(final SCIMAttributeValue value) {
087          return value.getDateValue();
088        }
089
090        /**
091         * {@inheritDoc}
092         */
093        public SCIMAttributeValue fromInstance(
094            final AttributeDescriptor attributeDescriptor, final Date value) {
095          return SCIMAttributeValue.createDateValue(value);
096        }
097      };
098
099  /**
100   * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
101   * to/from <code>Boolean</code> instances.
102   */
103  public static final AttributeValueResolver<Boolean> BOOLEAN_RESOLVER =
104      new AttributeValueResolver<Boolean>() {
105        /**
106         * {@inheritDoc}
107         */
108        public Boolean toInstance(final SCIMAttributeValue value) {
109          return value.getBooleanValue();
110        }
111
112        /**
113         * {@inheritDoc}
114         */
115        public SCIMAttributeValue fromInstance(
116            final AttributeDescriptor attributeDescriptor,
117            final Boolean value) {
118          return SCIMAttributeValue.createBooleanValue(value);
119        }
120      };
121
122  /**
123   * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
124   * to/from <code>byte[]</code> instances.
125   */
126  public static final AttributeValueResolver<byte[]> BINARY_RESOLVER =
127      new AttributeValueResolver<byte[]>() {
128
129        /**
130         * {@inheritDoc}
131         */
132        @Override
133        public byte[] toInstance(final SCIMAttributeValue value) {
134          return value.getBinaryValue();
135        }
136
137        /**
138         * {@inheritDoc}
139         */
140        @Override
141        public SCIMAttributeValue fromInstance(
142            final AttributeDescriptor attributeDescriptor,
143            final byte[] value) {
144          return SCIMAttributeValue.createBinaryValue(value);
145        }
146      };
147
148  /**
149   * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
150   * to/from <code>Decimal</code> instances.
151   */
152  public static final AttributeValueResolver<Double> DECIMAL_RESOLVER =
153      new AttributeValueResolver<Double>() {
154        /**
155         * {@inheritDoc}
156         */
157        public Double toInstance(final SCIMAttributeValue value) {
158          return value.getDecimalValue();
159        }
160
161        /**
162         * {@inheritDoc}
163         */
164        public SCIMAttributeValue fromInstance(
165            final AttributeDescriptor attributeDescriptor,
166            final Double value) {
167          return SCIMAttributeValue.createStringValue(String.valueOf(value));
168        }
169      };
170
171  /**
172   * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
173   * to/from <code>Integer</code> instances.
174   */
175  public static final AttributeValueResolver<Long> INTEGER_RESOLVER =
176      new AttributeValueResolver<Long>() {
177        /**
178         * {@inheritDoc}
179         */
180        public Long toInstance(final SCIMAttributeValue value) {
181          return value.getIntegerValue();
182        }
183
184        /**
185         * {@inheritDoc}
186         */
187        public SCIMAttributeValue fromInstance(
188            final AttributeDescriptor attributeDescriptor,
189            final Long value) {
190          return SCIMAttributeValue.createStringValue(String.valueOf(value));
191        }
192      };
193
194
195}