/* * Copyright (C) 2005-2017 ManyDesigns srl. All rights reserved. * http://www.manydesigns.com/ * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package com.manydesigns.portofino.logic; import com.manydesigns.elements.ognl.OgnlUtils; import com.manydesigns.elements.options.DefaultSelectionProvider; import com.manydesigns.elements.reflection.ClassAccessor; import com.manydesigns.elements.reflection.JavaClassAccessor; import com.manydesigns.elements.reflection.PropertyAccessor; import com.manydesigns.elements.text.TextFormat; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.MessageFormat; import java.util.Collection; /** * @author Paolo Predonzani - paolo.predonzani@manydesigns.com * @author Angelo Lupo - angelo.lupo@manydesigns.com * @author Giampiero Granatella - giampiero.granatella@manydesigns.com * @author Alessio Stalla - alessio.stalla@manydesigns.com */ public class SelectionProviderLogic { public static final String copyright = "Copyright (C) 2005-2017 ManyDesigns srl"; public static final Logger logger = LoggerFactory.getLogger(SelectionProviderLogic.class); public static DefaultSelectionProvider createSelectionProvider (String name, int fieldCount, Class[] fieldTypes, Collection<Object[]> objects) { DefaultSelectionProvider selectionProvider = new DefaultSelectionProvider(name, fieldCount); for (Object[] valueAndLabel : objects) { Object[] values = new Object[fieldCount]; String[] labels = new String[fieldCount]; for (int j = 0; j < fieldCount; j++) { Class valueType = fieldTypes[j]; values[j] = OgnlUtils.convertValue(valueAndLabel[j * 2], valueType); labels[j] = OgnlUtils.convertValueToString(valueAndLabel[j*2+1]); } boolean active = true; if(valueAndLabel.length > 2 * fieldCount) { Object booleanValue = OgnlUtils.convertValue(valueAndLabel[fieldCount * 2], Boolean.class); active = booleanValue instanceof Boolean && (Boolean) booleanValue; } selectionProvider.appendRow(values, labels, active); } return selectionProvider; } public static DefaultSelectionProvider createSelectionProvider( String name, Collection objects, PropertyAccessor[] propertyAccessors, @Nullable TextFormat[] textFormats ) { int fieldsCount = propertyAccessors.length; DefaultSelectionProvider selectionProvider = new DefaultSelectionProvider(name, propertyAccessors.length); for (Object current : objects) { boolean active = true; if(current instanceof Object[]) { Object[] valueAndActive = (Object[]) current; if(valueAndActive.length > 1) { active = valueAndActive[1] instanceof Boolean && (Boolean) valueAndActive[1]; } if(valueAndActive.length > 0) { current = valueAndActive[0]; } else { throw new IllegalArgumentException("Invalid selection provider query result - sp: " + name); } } Object[] values = new Object[fieldsCount]; String[] labels = new String[fieldsCount]; int j = 0; for (PropertyAccessor property : propertyAccessors) { Object value = property.get(current); values[j] = value; if (textFormats == null || textFormats[j] == null) { String label = OgnlUtils.convertValueToString(value); labels[j] = label; } else { TextFormat textFormat = textFormats[j]; labels[j] = textFormat.format(current); } j++; } selectionProvider.appendRow(values, labels, active); } return selectionProvider; } public static DefaultSelectionProvider createSelectionProvider (String name, Collection objects, Class objectClass, @Nullable TextFormat[] textFormats, String[] propertyNames) { ClassAccessor classAccessor = JavaClassAccessor.getClassAccessor(objectClass); PropertyAccessor[] propertyAccessors = new PropertyAccessor[propertyNames.length]; for (int i = 0; i < propertyNames.length; i++) { String currentName = propertyNames[i]; try { PropertyAccessor propertyAccessor = classAccessor.getProperty(currentName); propertyAccessors[i] = propertyAccessor; } catch (Throwable e) { String msg = MessageFormat.format( "Could not access property: {0}", currentName); logger.warn(msg, e); throw new IllegalArgumentException(msg, e); } } return createSelectionProvider(name, objects, propertyAccessors, textFormats); } }