package org.jboss.seam.wiki.core.action; import org.jboss.seam.annotations.*; import org.jboss.seam.ScopeType; import org.jboss.seam.international.StatusMessages; import org.jboss.seam.log.Log; import org.jboss.seam.wiki.core.model.User; import org.jboss.seam.wiki.preferences.PreferenceVisibility; import org.jboss.seam.wiki.preferences.PreferenceValue; import org.jboss.seam.wiki.preferences.PreferenceProvider; import org.jboss.seam.wiki.preferences.metamodel.PreferenceEntity; import org.jboss.seam.wiki.preferences.metamodel.PreferenceRegistry; import org.hibernate.validator.InvalidValue; import static org.jboss.seam.international.StatusMessage.Severity.WARN; import java.util.*; import java.io.Serializable; @Name("prefEditor") @Scope(ScopeType.CONVERSATION) public class PreferenceEditor implements Serializable { @Logger static Log log; @In private StatusMessages statusMessages; @In PreferenceProvider preferenceProvider; @In PreferenceRegistry preferenceRegistry; private User user; private PreferenceVisibility[] visibilities; private List<PreferenceEntity> preferenceEntities; private PreferenceEntity preferenceEntity; private List<PreferenceValue> preferenceValues; boolean valid = true; public String save() { log.debug("saving preference values"); if (preferenceEntity == null) return null; validate(); if (!valid) return "failed"; preferenceProvider.storeValues(new HashSet<PreferenceValue>(preferenceValues), user, null); preferenceProvider.flush(); log.debug("completed saving of preference values"); return null; } public void validate() { log.debug("validating preference component values"); if (preferenceEntity == null) return; valid = true; Map<PreferenceEntity.Property, InvalidValue[]> invalidProperties = preferenceEntity.validate(preferenceValues, Arrays.asList(visibilities)); for (Map.Entry<PreferenceEntity.Property, InvalidValue[]> entry : invalidProperties.entrySet()) { for (InvalidValue validationError : entry.getValue()) { valid = false; statusMessages.addToControlFromResourceBundleOrDefault( "preferenceValidationErrors", WARN, "preferenceValueValidationFailed." + preferenceEntity.getEntityName() + "." + entry.getKey().getFieldName(), preferenceEntity.getDescription() + " - '" + entry.getKey().getDescription() + "': " + validationError.getMessage()); } } } public void selectPreferenceEntity(PreferenceEntity selectedPreferenceEntity) { preferenceEntity = selectedPreferenceEntity; log.debug("selected preference entity: " + preferenceEntity); preferenceValues = new ArrayList<PreferenceValue>( preferenceProvider.loadValues(preferenceEntity.getEntityName(), user, null, Arrays.asList(visibilities)) ); } private void loadPreferenceEntities() { preferenceEntities = new ArrayList<PreferenceEntity>(preferenceRegistry.getPreferenceEntities(visibilities)); } public List<PreferenceEntity> getPreferenceEntities() { if (preferenceEntities == null) loadPreferenceEntities(); return preferenceEntities; } public PreferenceEntity getPreferenceEntity() { return preferenceEntity; } public List<PreferenceValue> getPreferenceValues() { return preferenceValues; } public void setUser(User user) { this.user = user; } public void setVisibilities(PreferenceVisibility[] visibilities) { this.visibilities = visibilities; } public boolean isValid() { return valid; } }