package jpaoletti.jpm.struts; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import jpaoletti.jpm.converter.ConverterException; import jpaoletti.jpm.core.*; import jpaoletti.jpm.util.KeyValue; /** * * @author jpaoletti */ public class CollectionHelper { private static final Pattern DISPLAY_PATTERN = Pattern.compile("\\{.*?\\}"); private String display; public CollectionHelper(String _display) throws ConverterException { this.display = _display; } public List<String> getListOfTexts(final Collection collection) throws ConverterException { final List<String> result = new ArrayList(); for (Object object : collection) { result.add(getObjectDisplay(object)); } return result; } public String getObjectDisplay(Object object) { if (getDisplay() == null) { return object == null ? "" : object.toString(); } final Map<String, String> replaces = new HashMap<String, String>(); final Matcher matcher = DISPLAY_PATTERN.matcher(getDisplay()); while (matcher.find()) { final String _display_field = matcher.group().replaceAll("\\{", "").replaceAll("\\}", ""); replaces.put("{" + _display_field + "}", PresentationManager.getPm().getAsString(object, _display_field)); } String result = getDisplay(); for (Map.Entry<String, String> entry : replaces.entrySet()) { result = result.replace(entry.getKey(), entry.getValue()); } return result; } public String getDisplay() { if (display != null && "".equals(display.trim())) { return null; } return display; } public List<KeyValue> getFullList(PMContext ctx, Entity entity, String listFilter, String stringFilter, String sortField, String sortd, String relatedFieldName, Object relatedFieldValue) throws ConverterException { final ListSort sort = new ListSort(sortField, (sortd == null) ? ListSort.SortDirection.ASC : ListSort.SortDirection.DESC); ListFilter lfilter = null; if (listFilter != null && listFilter.compareTo("null") != 0 && listFilter.compareTo("") != 0) { lfilter = (ListFilter) ctx.getPresentationManager().newInstance(listFilter); } final List<KeyValue> result = new ArrayList<KeyValue>(); try { final List<?> list; final EntityFilter filter = entity.getDataAccess().createFilter(ctx); if (stringFilter != null && !"".equals(stringFilter.trim()) && getDisplay() != null) { filter.setBehavior(FilterBehavior.OR); final Matcher matcher = DISPLAY_PATTERN.matcher(getDisplay()); while (matcher.find()) { final String _display_field = matcher.group().replaceAll("\\{", "").replaceAll("\\}", ""); filter.addFilter(_display_field, stringFilter, FilterOperation.LIKE); } filter.process(entity); } if (relatedFieldName != null && relatedFieldValue != null) { //If we have a related object, search is with "AND" behaviour //and will break any multi field display search. filter.setBehavior(FilterBehavior.AND); filter.addFilter(relatedFieldName, relatedFieldValue, FilterOperation.EQ); } list = entity.getDataAccess().list(ctx, filter, lfilter, sort, null, null); if (list == null) { return null; } for (Object object : list) { result.add(new KeyValue( entity.getDataAccess().getInstanceId(ctx, new EntityInstanceWrapper(object)).getValue(), getObjectDisplay(object))); } } catch (PMException ex) { throw new ConverterException(ex); } return result; } }