001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2008 Sun Microsystems, Inc.
026     */
027    package org.opends.server.types;
028    
029    
030    /**
031     * This class defines a data structure that defines a set of sort
032     * criteria that may be used to order entries in a set of search
033     * results.  The sort order object is comprised of one or more sort
034     * keys, which indicate which attribute types should be used to
035     * perform the sort and information about the ordering to use for
036     * those attributes.  If the sort order has multiple sort keys, then
037     * the first sort key will be used as the primary sort criteria, and
038     * the second will only be used in cases where the values of the
039     * attribute associated with the first sort key are equal, the third
040     * will only be used if the first and second values are equal, etc.
041     * If all of the sort key attributes for two entries are identical,
042     * then the relative order for those entries is undefined.
043     */
044    @org.opends.server.types.PublicAPI(
045         stability=org.opends.server.types.StabilityLevel.VOLATILE,
046         mayInstantiate=true,
047         mayExtend=false,
048         mayInvoke=true)
049    public final class SortOrder
050    {
051      // The set of sort keys in this sort order.
052      private SortKey[] sortKeys;
053    
054    
055    
056      /**
057       * Creates a new sort order with a single key.
058       *
059       * @param  sortKey  The sort key to use in this sort order.
060       */
061      public SortOrder(SortKey sortKey)
062      {
063        this.sortKeys = new SortKey[] { sortKey };
064      }
065    
066    
067    
068      /**
069       * Creates a new sort order with the provided set of sort keys.
070       *
071       * @param  sortKeys  The set of sort keys to use for this sort
072       *                   order.
073       */
074      public SortOrder(SortKey[] sortKeys)
075      {
076        this.sortKeys = new SortKey[sortKeys.length];
077        System.arraycopy(sortKeys, 0, this.sortKeys, 0, sortKeys.length);
078      }
079    
080    
081    
082      /**
083       * Retrieves the sort keys for this sort order.
084       *
085       * @return  The sort keys for this sort order.
086       */
087      public SortKey[] getSortKeys()
088      {
089        return sortKeys;
090      }
091    
092    
093    
094      /**
095       * Retrieves a string representation of this sort order.
096       *
097       * @return  A string representation of this sort order.
098       */
099      public String toString()
100      {
101        StringBuilder buffer = new StringBuilder();
102        toString(buffer);
103        return buffer.toString();
104      }
105    
106    
107    
108      /**
109       * Appends a string representation of this sort order to the
110       * provided buffer.
111       *
112       * @param  buffer  The buffer to which the information should be
113       *                 appended.
114       */
115      public void toString(StringBuilder buffer)
116      {
117        buffer.append("SortOrder(");
118    
119        if (sortKeys.length > 0)
120        {
121          sortKeys[0].toString(buffer);
122    
123          for (int i=1; i < sortKeys.length; i++)
124          {
125            buffer.append(",");
126            sortKeys[i].toString(buffer);
127          }
128        }
129    
130        buffer.append(")");
131      }
132    
133      /**
134       * Retrieves the hash code for this sort order.
135       *
136       * @return  The hash code for this sort order.
137       */
138      public int hashCode()
139      {
140        int hashCode = 0;
141        for(SortKey sortKey : sortKeys)
142        {
143          hashCode += sortKey.hashCode();
144        }
145    
146        return hashCode;
147      }
148    
149      /**
150       * Indicates whether this sort order is equal to the provided
151       * object.
152       *
153       * @param  o  The object for which to make the determination.
154       *
155       * @return  <CODE>true</CODE> if the provide object is equal to this
156       *          sort order, or <CODE>false</CODE> if it is not.
157       */
158      public boolean equals(Object o)
159      {
160        if(o == null)
161        {
162          return false;
163        }
164    
165        if (o == this)
166        {
167          return true;
168        }
169    
170        if (! (o instanceof SortOrder))
171        {
172          return false;
173        }
174    
175        SortOrder s = (SortOrder) o;
176    
177        if(sortKeys.length != s.sortKeys.length)
178        {
179          return false;
180        }
181    
182        for(int i = 0; i < sortKeys.length; i++)
183        {
184          if(!sortKeys[i].equals(s.sortKeys[i]))
185          {
186            return false;
187          }
188        }
189    
190        return true;
191      }
192    }
193