package rocks.inspectit.ui.rcp.preferences.valueproviders; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; 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; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition; /** * Value provider for list of {@link CmrRepositoryDefinition}s. * * @author Ivan Senic * */ class CmrRepositoryPreferenceValueProvider extends PreferenceValueProvider<List<CmrRepositoryDefinition>> { /** * Constant for denoting the empty list. */ private static final String EMPTY_LIST = "EMPTY_LIST"; /** * {@inheritDoc} */ @Override public boolean isObjectValid(Object object) { if (object instanceof List) { List<?> list = (List<?>) object; for (Object objectInCollection : list) { if (!objectInCollection.getClass().equals(CmrRepositoryDefinition.class)) { return false; } } return true; } return false; } /** * {@inheritDoc} */ @Override public String getValueForObject(List<CmrRepositoryDefinition> repositoryDefinitions) { if (CollectionUtils.isEmpty(repositoryDefinitions)) { return EMPTY_LIST; } else { StringBuilder value = new StringBuilder(); for (CmrRepositoryDefinition cmrRepositoryDefinition : repositoryDefinitions) { value.append(cmrRepositoryDefinition.getIp() + PreferencesConstants.PREF_SPLIT_REGEX + cmrRepositoryDefinition.getPort() + PreferencesConstants.PREF_SPLIT_REGEX + cmrRepositoryDefinition.getName() + PreferencesConstants.PREF_SPLIT_REGEX); if (null != cmrRepositoryDefinition.getDescription()) { value.append(cmrRepositoryDefinition.getDescription()); } value.append(PreferencesConstants.PREF_OBJECT_SEPARATION_TOKEN); } return value.toString(); } } /** * {@inheritDoc} */ @Override public List<CmrRepositoryDefinition> getObjectFromValue(String value) throws PreferenceException { if (EMPTY_LIST.equals(value)) { return Collections.emptyList(); } else { List<CmrRepositoryDefinition> returnList = new ArrayList<>(); StringTokenizer tokenizer = new StringTokenizer(value, PreferencesConstants.PREF_OBJECT_SEPARATION_TOKEN); while (tokenizer.hasMoreTokens()) { String nextValue = tokenizer.nextToken(); String[] splitted = nextValue.split(PreferencesConstants.PREF_SPLIT_REGEX); CmrRepositoryDefinition cmrRepositoryDefinition = null; if (splitted.length == 2) { try { cmrRepositoryDefinition = new CmrRepositoryDefinition(splitted[0], Integer.parseInt(splitted[1])); } catch (Exception e) { throw new PreferenceException("Error trying to create a CMR repository definition from preference store.", e); } } else if (splitted.length > 2) { try { cmrRepositoryDefinition = new CmrRepositoryDefinition(splitted[0], Integer.parseInt(splitted[1]), splitted[2]); } catch (Exception e) { throw new PreferenceException("Error trying to create a CMR repository definition from preference store.", e); } } else { throw new PreferenceException("CMR repository definition values saved in the preference store are not correct. Received values via the string '" + nextValue + "' are " + Arrays.asList(splitted) + ". Definition will be skipped."); } if ((null != cmrRepositoryDefinition) && (splitted.length > 3)) { cmrRepositoryDefinition.setDescription(splitted[3]); } returnList.add(cmrRepositoryDefinition); } return returnList; } } }