001package org.kuali.rice.krms.util;
002
003import java.io.Serializable;
004import java.util.ArrayList;
005import java.util.Iterator;
006import java.util.List;
007
008/**
009 * Created with IntelliJ IDEA.
010 * User: SW
011 * Date: 2013/02/12
012 * Time: 12:15 PM
013 * To change this template use File | Settings | File Templates.
014 */
015public class AlphaIterator implements Serializable, Iterator {
016
017    private List<Inner> list = new ArrayList<Inner>();
018
019    @Override
020    public boolean hasNext() {
021        return true;
022    }
023
024    @Override
025    public Object next() {
026
027        //Add an initial value to the list
028        if (list.isEmpty()) {
029            list.add(new Inner());
030        } else {
031
032            //Increment the value
033            for (int i = list.size() - 1; i >= 0; i--) {
034                Inner in = list.get(i);
035                if (in.increment()>0) {
036                    break;
037                } else {
038                    in.reset();
039                    if (i == 0) {
040                        list.add(new Inner());
041                    }
042                }
043            }
044        }
045
046        //Create the return string
047        String returnValue = "";
048        for (Inner in : list) {
049            returnValue = returnValue + (char)in.current();
050        }
051
052        return returnValue;
053    }
054
055    @Override
056    public void remove() {
057        //To change body of implemented methods use File | Settings | File Templates.
058    }
059
060    private class Inner {
061
062        private final static int START = 'A';
063        private final static int END = 'Z';
064
065        private int value;
066
067        public Inner() {
068            value = START;
069        }
070
071        public void reset() {
072            value = START;
073        }
074
075        public int current() {
076            return value;
077        }
078
079        public int increment() {
080            if (value == END) {
081                return -1;
082            } else {
083                return value++;
084            }
085        }
086
087    }
088}