001/*
002 * Copyright 2011-2016 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.SCIMAttribute;
023import com.unboundid.scim.sdk.SCIMAttributeValue;
024
025import java.util.ArrayList;
026import java.util.List;
027
028
029
030/**
031 * A complex type that specifies BULK configuration options.
032 */
033public class BulkConfig
034{
035  private final boolean supported;
036  private final long maxOperations;
037  private final long maxPayloadSize;
038
039
040
041  /**
042   * The <code>AttributeValueResolver</code> that resolves SCIM attribute values
043   * to/from <code>BulkConfig</code> instances.
044   */
045  public static final AttributeValueResolver<BulkConfig>
046      BULK_CONFIG_RESOLVER =
047      new AttributeValueResolver<BulkConfig>()
048      {
049        /**
050         * {@inheritDoc}
051         */
052        @Override
053        public BulkConfig toInstance(final SCIMAttributeValue value) {
054          return new BulkConfig(
055              value.getSubAttributeValue("supported",
056                  BOOLEAN_RESOLVER),
057              value.getSubAttributeValue("maxOperations",
058                  INTEGER_RESOLVER),
059              value.getSubAttributeValue("maxPayloadSize",
060                  INTEGER_RESOLVER));
061        }
062
063        /**
064         * {@inheritDoc}
065         */
066        @Override
067        public SCIMAttributeValue fromInstance(
068            final AttributeDescriptor attributeDescriptor,
069            final BulkConfig value)
070            throws InvalidResourceException
071        {
072          final List<SCIMAttribute> subAttributes =
073              new ArrayList<SCIMAttribute>(3);
074
075          final AttributeDescriptor supportedDescriptor =
076              attributeDescriptor.getSubAttribute("supported");
077          subAttributes.add(
078              SCIMAttribute.create(
079                  supportedDescriptor,
080                  BOOLEAN_RESOLVER.fromInstance(supportedDescriptor,
081                      value.supported)));
082
083          final AttributeDescriptor maxOperationsDescriptor =
084              attributeDescriptor.getSubAttribute("maxOperations");
085          subAttributes.add(
086              SCIMAttribute.create(
087                  maxOperationsDescriptor,
088                  INTEGER_RESOLVER.fromInstance(maxOperationsDescriptor,
089                      value.maxOperations)));
090
091          final AttributeDescriptor maxPayloadSizeDescriptor =
092              attributeDescriptor.getSubAttribute("maxPayloadSize");
093          subAttributes.add(
094              SCIMAttribute.create(
095                  maxPayloadSizeDescriptor,
096                  INTEGER_RESOLVER.fromInstance(maxPayloadSizeDescriptor,
097                      value.maxPayloadSize)));
098
099          return SCIMAttributeValue.createComplexValue(subAttributes);
100        }
101      };
102
103
104
105  /**
106   * Create a <code>BulkConfig</code> instance.
107   *
108   * @param supported       Specifies whether the BULK operation is supported.
109   * @param maxOperations   Specifies the maximum number of operations.
110   * @param maxPayloadSize  Specifies the maximum payload size in bytes.
111   */
112  public BulkConfig(final boolean supported,
113                    final long maxOperations,
114                    final long maxPayloadSize)
115  {
116    this.supported = supported;
117    this.maxOperations = maxOperations;
118    this.maxPayloadSize = maxPayloadSize;
119  }
120
121
122
123  /**
124   * Indicates whether the PATCH operation is supported.
125   * @return  {@code true} if the PATCH operation is supported.
126   */
127  public boolean isSupported()
128  {
129    return supported;
130  }
131
132
133
134  /**
135   * Retrieves the maximum number of operations.
136   * @return The maximum number of operations.
137   */
138  public long getMaxOperations()
139  {
140    return maxOperations;
141  }
142
143
144
145  /**
146   * Retrieves the maximum payload size in bytes.
147   * @return The maximum payload size in bytes.
148   */
149  public long getMaxPayloadSize()
150  {
151    return maxPayloadSize;
152  }
153
154
155  @Override
156  public boolean equals(final Object o)
157  {
158    if (this == o)
159    {
160      return true;
161    }
162    if (o == null || getClass() != o.getClass())
163    {
164      return false;
165    }
166
167    final BulkConfig that = (BulkConfig) o;
168
169    if (maxOperations != that.maxOperations)
170    {
171      return false;
172    }
173    if (maxPayloadSize != that.maxPayloadSize)
174    {
175      return false;
176    }
177    if (supported != that.supported)
178    {
179      return false;
180    }
181
182    return true;
183  }
184
185
186
187  @Override
188  public int hashCode()
189  {
190    int result = (supported ? 1 : 0);
191    result = 31 * result + (int) (maxOperations ^ (maxOperations >>> 32));
192    result = 31 * result + (int) (maxPayloadSize ^ (maxPayloadSize >>> 32));
193    return result;
194  }
195
196
197
198  @Override
199  public String toString()
200  {
201    final StringBuilder sb = new StringBuilder();
202    sb.append("BulkConfig");
203    sb.append("{supported=").append(supported);
204    sb.append(", maxOperations=").append(maxOperations);
205    sb.append(", maxPayloadSize=").append(maxPayloadSize);
206    sb.append('}');
207    return sb.toString();
208  }
209}