/* * � Copyright IBM Corp. 2010 * * 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. */ package com.ibm.xsp.extlib.component.picker.data; import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import com.ibm.xsp.complex.ValueBindingObjectImpl; import com.ibm.xsp.util.StateHolderUtil; /** * Name picker data aggregator. * <p> * This data provider is aggregating the data coming from multiple sources. * </p> */ public class NamePickerAggregatorData extends ValueBindingObjectImpl implements INamePickerData { private List<INamePickerData> dataProviders; public NamePickerAggregatorData() { } public List<INamePickerData> getDataProviders() { return dataProviders; } public void addDataProvider(INamePickerData provider) { if(dataProviders==null) { dataProviders = new ArrayList<INamePickerData>(); } dataProviders.add(provider); } @Override public Object saveState(FacesContext context) { Object[] state = new Object[2]; state[0] = super.saveState(context); state[1] = StateHolderUtil.saveList(context, dataProviders); return state; } @Override public void restoreState(FacesContext context, Object value) { Object[] state = (Object[])value; super.restoreState(context, state[0]); this.dataProviders = StateHolderUtil.restoreList(context, getComponent(), state[1]); } // =================================================================== // Value picker delegation // =================================================================== public boolean hasCapability(int capability) { if(capability==CAPABILITY_MULTIPLESOURCES) { return true; } if(dataProviders!=null && !dataProviders.isEmpty()) { int count = dataProviders.size(); for(int i=0; i<count; i++) { INamePickerData e = dataProviders.get(i); // If one provider miss the capability, then it is not available... if(!e.hasCapability(capability)) { return false; } } // Else, we have it return true; } return false; } public String[] getSourceLabels() { if(dataProviders!=null && !dataProviders.isEmpty()) { ArrayList<String> list = new ArrayList<String>(); int count = dataProviders.size(); for(int i=0; i<count; i++) { INamePickerData data = dataProviders.get(i); String[] labels = data.getSourceLabels(); if(labels!=null) { for(int j=0; j<labels.length; j++) { list.add(labels[j]); } } } return list.toArray(new String[list.size()]); } return null; } public List<IPickerEntry> loadEntries(Object[] ids, String[] attributeNames) { List<IPickerEntry> entries = new ArrayList<IPickerEntry>(ids.length); for(int i=0; i<ids.length; i++) { entries.add(null); } if(dataProviders!=null && !dataProviders.isEmpty()) { int count = dataProviders.size(); for(int i=0; i<count; i++) { List<IPickerEntry> r = dataProviders.get(i).loadEntries(ids,attributeNames); for(int j=0; j<r.size(); j++) { IPickerEntry res = r.get(j); // The entry can be null if the id was not found if(res!=null) { entries.set(j, res); } } } } return entries; } public IPickerResult readEntries(IPickerOptions options) { if(dataProviders!=null && !dataProviders.isEmpty()) { // // Aggregated results? // int count = dataProviders.size(); // for(int i=0; i<count; i++) { // IPickerResult r = dataProviders.get(i).readEntries(options); // NamePickerAggregatorEntry e = dataProviders.get(i); // } int source = options.getSource(); int off = 0; for( int i=0; i<dataProviders.size(); i++) { INamePickerData pd = dataProviders.get(i); int srcCount = pd.getSourceLabels().length; int relIdx = source-off; if(relIdx<srcCount) { IPickerOptions newOptions = new AggregatedPickerOptions(options,relIdx); return pd.readEntries(newOptions); } off += srcCount; } } return null; } public static class AggregatedPickerOptions implements IPickerOptions { private IPickerOptions delegate; private int source; public AggregatedPickerOptions(IPickerOptions delegate, int source) { this.delegate = delegate; this.source = source; } // Return the new source index public int getSource() { return source; } public String[] getAttributeNames() { return delegate.getAttributeNames(); } public int getCount() { return delegate.getCount(); } public String getKey() { return delegate.getKey(); } public int getStart() { return delegate.getStart(); } public String getStartKey() { return delegate.getStartKey(); } } }