package rocks.inspectit.ui.rcp.preferences.valueproviders; import java.util.ArrayList; import java.util.Collection; import java.util.StringTokenizer; import org.apache.commons.collections.CollectionUtils; import rocks.inspectit.ui.rcp.preferences.PreferenceException; import rocks.inspectit.ui.rcp.preferences.PreferencesConstants; import rocks.inspectit.ui.rcp.preferences.valueproviders.PreferenceValueProviderFactory.PreferenceValueProvider; /** * This {@link PreferenceValueProvider} converts any collection that members in primitive warper * types to preference value. Later on this preference value will be transformed to a collection of * strings, and thus needs transformation to initial class of collection members. * * @author Ivan Senic * */ public class CollectionPreferenceValueProvider extends PreferenceValueProvider<Collection<?>> { /** * Constant for denoting the empty collection. */ private static final String EMPTY_COLLECTION = "EMPTY_COLLECTION"; /** * {@inheritDoc} */ @Override public boolean isObjectValid(Object object) { return object instanceof Collection; } /** * {@inheritDoc} */ @Override public String getValueForObject(Collection<?> collection) throws PreferenceException { if (CollectionUtils.isEmpty(collection)) { return EMPTY_COLLECTION; } else { StringBuilder stringBuilder = new StringBuilder(); for (Object object : collection) { stringBuilder.append(getValueForCollectionMember(object) + PreferencesConstants.PREF_OBJECT_SEPARATION_TOKEN); } return stringBuilder.toString(); } } /** * {@inheritDoc} */ @Override public Collection<?> getObjectFromValue(String value) throws PreferenceException { if (EMPTY_COLLECTION.equals(value)) { return getCollectionForResults(); } else { Collection<Object> results = getCollectionForResults(); StringTokenizer tokenizer = new StringTokenizer(value, PreferencesConstants.PREF_OBJECT_SEPARATION_TOKEN); while (tokenizer.hasMoreElements()) { results.add(getObjectForCollectionMember(tokenizer.nextToken())); } return results; } } /** * Returns Collection type to use when creating resulting collection from strings. * * @return Returns Collection type to use when creating resulting collection from strings. */ protected Collection<Object> getCollectionForResults() { return new ArrayList<>(); } /** * Returns String value for collection member. * <p> * Sub-classes can override. * * @param object * Member. * @return String value. */ protected String getValueForCollectionMember(Object object) { return object.toString(); } /** * Returns collection member for saved String value. * <p> * Sub-classes can override. * * @param value * String value as object was saved.. * @return Collection member.. */ protected Object getObjectForCollectionMember(String value) { return value; } }