package extlib.pickers; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.ibm.commons.util.QuickSort; import com.ibm.commons.util.StringUtil; import com.ibm.xsp.FacesExceptionEx; import com.ibm.xsp.extlib.component.picker.data.IPickerEntry; import com.ibm.xsp.extlib.component.picker.data.IPickerOptions; import com.ibm.xsp.extlib.component.picker.data.IPickerResult; import com.ibm.xsp.extlib.component.picker.data.IValuePickerData; import com.ibm.xsp.extlib.component.picker.data.SimplePickerResult; import extlib.SampleDataUtil; public class SimplePicker implements IValuePickerData { private int searchIndex = 0; //1; public SimplePicker() { } public String[] getSourceLabels() { return null; } public boolean hasCapability(int capability) { if(capability==CAPABILITY_EXTRAATTRIBUTES) { return false; } return false; } public List<IPickerEntry> loadEntries(Object[] ids, String[] attributes) { List<IPickerEntry> entries = new ArrayList<IPickerEntry>(); if(ids!=null) { String[][] allStates = readStates(searchIndex); for(int i=0; i<ids.length; i++) { String id = ids[i].toString(); String label = null; for(int j=0; j<allStates.length; j++) { if(allStates[j][1].equals(id)) { label = allStates[j][0]; break; } } entries.add(new SimplePickerResult.Entry(id,label)); } } return entries; } public IPickerResult readEntries(IPickerOptions options) { String startKey = options.getStartKey(); String key = options.getKey(); int start = options.getStart(); int count = options.getCount(); ValueGenerator g=new ValueGenerator((String)key,(String)startKey,start,searchIndex); List<IPickerEntry> entries = new ArrayList<IPickerEntry>(); while(g.hasNext() && count>0) { String[] v = g.next(); entries.add(new SimplePickerResult.Entry(v[1],v[0])); count--; } return new SimplePickerResult(entries,-1); } private static class ValueGenerator { private String[][] states; private int start; ValueGenerator(String key, String startKey, int start, int searchIndex) { this.start = start; String[][] allStates = readStates(searchIndex); if(StringUtil.isNotEmpty(key)) { int first = -1; ArrayList<String[]> l = new ArrayList<String[]>(); for(int i=0; i<allStates.length; i++) { String state = allStates[i][searchIndex]; if(StringUtil.startsWithIgnoreCase(state,key)) { first = i; break; } } if(first>=0) { for(int i=first; i<allStates.length; i++) { String state = allStates[i][searchIndex]; if(StringUtil.startsWithIgnoreCase(state,key)) { l.add(allStates[i]); } } } states = l.toArray(new String[l.size()][]); } else if(StringUtil.isNotEmpty(startKey)) { int first = -1; ArrayList<String[]> l = new ArrayList<String[]>(); for(int i=0; i<allStates.length; i++) { String state = allStates[i][searchIndex]; if(state.compareToIgnoreCase(startKey)>=0) { first = i; break; } } if(first>=0) { for(int i=first; i<allStates.length; i++) { l.add(allStates[i]); } } states = l.toArray(new String[l.size()][]); } else { states = allStates; } } boolean hasNext() { return start<states.length; } String[] next() { String[] key = states[start++]; return key; } }; private static String[][] states; private static final String[][] readStates(final int searchIndex) { if(states==null) { try { String[] allStates = SampleDataUtil.readStates(); states = new String[allStates.length][]; for(int i=0; i<states.length; i++) { states[i] = StringUtil.splitString(allStates[i], ',', true); } // Sort by Label (new QuickSort.ObjectArray(states) { @Override public int compare(Object s1, Object s2) { String l1 = ((String[])s1)[searchIndex]; String l2 = ((String[])s2)[searchIndex]; return StringUtil.compareToIgnoreCase(l1, l2); } }).sort(); } catch(IOException e) { throw new FacesExceptionEx("Unable to read the state list"); } } return states; } }