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.sdk;
019    
020    import com.unboundid.scim.data.BaseResource;
021    import com.unboundid.scim.marshal.Marshaller;
022    
023    import java.io.OutputStream;
024    import java.util.Iterator;
025    import java.util.List;
026    
027    /**
028     * Represents a list of SCIM resources returned by the service provider from
029     * a query/listing request.
030     */
031    public class Resources<R extends BaseResource> implements Iterable<R>,
032        SCIMResponse
033    {
034      private final int totalResults;
035      private final int startIndex;
036      private final List<R> resourceList;
037    
038      /**
039       * Create a new resources response from the provided list. The number of
040       * total results will be set to the size of the list and the default value of
041       * 1 for start index.
042       *
043       * @param resourceList The list of resources to create the response from.
044       */
045      public Resources(final List<R> resourceList)
046      {
047        this(resourceList, resourceList.size(), 1);
048      }
049    
050      /**
051       * Create a new resources response from the provided list.
052       *
053       * @param resourceList The list of resources to create the response from.
054       * @param totalResults The total number of results matching the Consumer query
055       * @param startIndex The 1-based index of the first result in the current set
056       *                   of search results
057       */
058      public Resources(final List<R> resourceList, final int totalResults,
059                       final int startIndex)
060      {
061        this.totalResults = totalResults;
062        this.startIndex = startIndex;
063        this.resourceList = resourceList;
064      }
065    
066      /**
067       * Retrieves the 1-based index of the first result in the current set of
068       * search results.
069       *
070       * @return The 1-based index of the first result in the current set of
071       *         search results.
072       */
073      public long getStartIndex()
074      {
075        return startIndex;
076      }
077    
078      /**
079       * Retrieves the total number of results matching the Consumer query.
080       *
081       * @return The total number of results matching the Consumer query.
082       */
083      public long getTotalResults()
084      {
085        return totalResults;
086      }
087    
088      /**
089       * Retrieves the number of search results returned in this query response.
090       *
091       * @return The number of search results returned in this query response.
092       */
093      public int getItemsPerPage()
094      {
095        return resourceList.size();
096      }
097    
098      /**
099       * {@inheritDoc}
100       */
101      public Iterator<R> iterator() {
102        return resourceList.iterator();
103      }
104    
105      /**
106       * {@inheritDoc}
107       */
108      public void marshal(final Marshaller marshaller,
109                          final OutputStream outputStream)
110        throws Exception
111      {
112        marshaller.marshal(this, outputStream);
113      }
114    }