package org.nocket.gen.domain.element; import gengui.domain.AbstractDomainReference; import gengui.guiadapter.ConnectionReuse; import gengui.guiadapter.table.TableModelFactory; import gengui.util.ReflectionUtil; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.nocket.gen.domain.ref.WrappedDomainReferenceI; import org.nocket.gen.domain.visitor.DomainElementVisitorI; public class MultivaluePropertyElement<E extends AbstractDomainReference> extends AbstractDomainElement<E> { private List<MultivalueButtonElement<E>> buttonElements; private WrappedDomainReferenceI<E> columnAccessor; private List<MultivalueColumnElement<E>> columns; public MultivaluePropertyElement(WrappedDomainReferenceI<E> accessor, Method method, WrappedDomainReferenceI<E> columnAccessor, List<MultivalueButtonElement<E>> buttonElements) { super(accessor, method); this.columnAccessor = columnAccessor; this.buttonElements = buttonElements; } public List<MultivalueColumnElement<E>> getColumns() { if (columns == null) { final String[] columnNames; final String[] columnPrompts; columns = new ArrayList<MultivalueColumnElement<E>>(); if (ReflectionUtil.hasChoicer(getAccessor().getRef(), getMethod())) { columnNames = new String[] { StringUtils.uncapitalize(getPropertyName()) }; columnPrompts = new String[] { getPrompt() }; columns.add(new MultivalueColumnElement<E>(getAccessor(), columnNames[0], columnPrompts[0], getMethod())); } else { Class<?> listType = ReflectionUtil.getCollectionContentType(getMethod()); columnNames = TableModelFactory.extractListProperties(listType); if (columnNamesFound(columnNames)) { for (int i = 0; i < columnNames.length; i++) { columnNames[i] = StringUtils.uncapitalize(columnNames[i]); } columnPrompts = TableModelFactory.columnNames(listType, columnNames); for (int i = 0; i < columnNames.length; i++) { columns.add(new MultivalueColumnElement<E>(columnAccessor, columnNames[i], columnPrompts[i])); } } } } return columns; } private boolean columnNamesFound(final String[] columnNames) { // check that columnNames is not empty and not an array with only a null object return ArrayUtils.isNotEmpty(columnNames) && !(columnNames.length == 1 && columnNames[0] == null); } public List<String> getPropertyColumnNames() { List<String> propertyColumnNames = new ArrayList<String>(); for (MultivalueColumnElement<E> c : getColumns()) { if (!c.isReadonlyFileType()) propertyColumnNames.add(c.getColumnName()); } return propertyColumnNames; } public List<MultivalueColumnElement> getDownloadColumnElements() { List<MultivalueColumnElement> downloadElements = new ArrayList<MultivalueColumnElement>(); for (MultivalueColumnElement<E> e : getColumns()) { if (e.isReadonlyFileType()) downloadElements.add(e); } return downloadElements; } public List<MultivalueButtonElement<E>> getButtonElements() { return buttonElements; } @Override public void accept(DomainElementVisitorI<E> visitor) { visitor.visitMultivalueProperty(this); } public WrappedDomainReferenceI<E> getColumnAccessor() { return columnAccessor; } @Override public boolean repeated() { return true; } @Override public DomainElementI<E> replicate(ConnectionReuse reuse) { return new MultivaluePropertyElement<E>(this.getAccessor().replicate(reuse), this.getMethod(), columnAccessor, buttonElements); } }