Package ariba.util.formatter

Source Code of ariba.util.formatter.IntegerArrayFormatter

/*
    Copyright 1996-2008 Ariba, Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

    $Id: //ariba/platform/util/core/ariba/util/formatter/IntegerArrayFormatter.java#6 $
*/

package ariba.util.formatter;

import ariba.util.core.ArrayUtil;
import ariba.util.core.Assert;
import ariba.util.core.Compare;
import ariba.util.core.Constants;
import ariba.util.core.FastStringBuffer;
import ariba.util.core.Sort;
import java.text.ParseException;
import java.util.Locale;

/**
    <code>IntegerArrayFormatter</code> is a subclass of <code>Formatter</code>
    which is responsible for formatting <code>int</code> arrays and/or
    <code>Integer</code> arrays.

    @aribaapi documented
*/
public class IntegerArrayFormatter extends Formatter
{
    /*-----------------------------------------------------------------------
        Constants
      -----------------------------------------------------------------------*/

    /**
        Our Java class name.

        @aribaapi private
    */
    public static final String ClassName = "ariba.util.formatter.IntegerArrayFormatter";


    /*-----------------------------------------------------------------------
        Constructor
      -----------------------------------------------------------------------*/

    /**
        Creates a new <code>IntegerArrayFormatter</code>.

        @aribaapi private
    */
    public IntegerArrayFormatter ()
    {
    }
   

    /*-----------------------------------------------------------------------
        Static Formatting
      -----------------------------------------------------------------------*/

    /**
        Returns a formatted string for the given <code>Integer</code> array.
        The array is first sorted and then formatted like "5, 1, 7".  Ranges
        of consecutive numbers are also consolidated, so the array "1,3,4,5"
        would be turned into the string "1, 3-5".

        @param  array the <code>Integer</code> array to format into a string
        @return       a string representation of the <code>Integer</code> array
        @aribaapi documented
    */
    public static String getStringValue (Integer[] array)
    {
            // return empty string if array is null or empty
        if (ArrayUtil.nullOrEmptyArray(array)) {
            return("");
        }

        FastStringBuffer buf = new FastStringBuffer();

            // copy the array
        int count = array.length;
        Integer[] integers = new Integer[count];
        System.arraycopy(array, 0, integers, 0, count);

            // sort the ints
        Compare compare = Formatter.getFormatterForType(Constants.IntegerType);
        Sort.objects(integers, compare);

            // turn the array into a string
        boolean inRange = false;
        Integer previous = null;
        for (int i = 0; i < count; i++) {
            Integer current = integers[i];
            if (i > 0) {
                    // start a range if the current value is one more than the
                    // previous value
                if (current.intValue() == previous.intValue() + 1) {
                    inRange = true;
                    previous = current;
                        // allow code below to handle range at end of array
                    if (i < count - 1) {
                        continue;
                    }
                }
                    // either the current value is not one more than the
                    // previous, or we're at the end of the array
                if (inRange) {
                    buf.append("-");
                    buf.append(previous.toString());
                    inRange = false;
                        // bail out if we're closing a range at the end of the
                        // array, otherwise fall through to the code below
                    if (previous == current) {
                        break;
                    }
                }
            }

                // add the current value to the buffer, with a comma if
                // it's not the first value in the array
            if (i != 0) {
                buf.append(", ");
            }
            buf.append(current.toString());

                // keep track of the current value for next time...
            previous = current;
        }

        return buf.toString();
    }

    /**
        Returns a formatted string for the given <code>int</code> array.  The
        array is first sorted and then formatted like "5, 1, 7".  Ranges of
        consecutive numbers are also consolidated, so the array "1,3,4,5"
        would be turned into the string "1, 3-5".

        @param  array the <code>int</code> array to format into a string
        @return       a string representation of the <code>int</code> array
        @aribaapi documented
    */
    public static String getStringValue (int[] array)
    {
            // return empty string if array is null or empty
        if (ArrayUtil.nullOrEmptyIntArray(array)) {
            return("");
        }

            // convert ints to Integers
        int count = array.length;
        Integer[] integers = new Integer[count];
        for (int i = 0; i < count; ++i) {
            integers[i] = Constants.getInteger(array[i]);
        }

        return(getStringValue(integers));
    }


    /*-----------------------------------------------------------------------
        Formatting
      -----------------------------------------------------------------------*/

    /**
        Returns a string representation of the given object in the given
        locale.  The object must be a non-null <code>Integer</code> array or
        <code>int</code> array.

        @param  value the array to format into a string
        @param  locale the <code>Locale</code> to use for formatting
        @return        a string representation of the array
        @aribaapi documented
    */
    protected String formatObject (Object value, Locale locale)
    {
        Assert.that((value instanceof int[] || value instanceof Integer[]),
                    "invalid type passed to IntegerFormatter.formatObject()");

        if (value instanceof Integer[]) {
            return getStringValue((Integer[])value);
        }
        else {
            return getStringValue((int[])value);
        }
    }


    /*-----------------------------------------------------------------------
        Parsing
      -----------------------------------------------------------------------*/

    protected Object parseString (String string, Locale locale)
      throws ParseException
    {
        throw new ParseException("parse not supported for integer arrays", 0);
    }

    public Object getValue (Object object, Locale locale)
    {
            // locale must be non-null
        Assert.that(locale != null, "invalid null Locale");

        if ((object instanceof Integer[]) || (object instanceof int[])) {
            return object;
        }
        else {
            try {
                return parseString(object.toString(), locale);
            }
            catch (ParseException e) {
                return null;
            }
        }
    }


    /*-----------------------------------------------------------------------
        Comparison
      -----------------------------------------------------------------------*/

    protected int compareObjects (Object o1, Object o2, Locale locale)
    {
        Assert.that(o1 instanceof Integer[] || o1 instanceof int[], "invalid type");
        Assert.that(o2 instanceof Integer[] || o2 instanceof int[], "invalid type");

            // no clear way to sort one array before the other
        return 0;
    }
}
TOP

Related Classes of ariba.util.formatter.IntegerArrayFormatter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.