From a3d601f0cb65eee784eb7b0d95f4981cb0279446 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 15 May 2012 10:07:41 +0200
Subject: [PATCH] OO-261: implements the automatic mapping of a property value
 to a self registrated user

---
 .../RegistrationAdminController.java          | 99 ++++++++++++++++++-
 .../registration/RegistrationController.java  | 20 ++++
 .../olat/registration/RegistrationModule.java | 54 ++++++++++
 .../_i18n/LocalStrings_de.properties          |  6 ++
 .../_i18n/LocalStrings_en.properties          |  6 ++
 .../propertyhandlers/MSNPropertyHandler.java  |  6 +-
 6 files changed, 186 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/olat/registration/RegistrationAdminController.java b/src/main/java/org/olat/registration/RegistrationAdminController.java
index 630a99030dc..ae521fa8368 100644
--- a/src/main/java/org/olat/registration/RegistrationAdminController.java
+++ b/src/main/java/org/olat/registration/RegistrationAdminController.java
@@ -19,13 +19,16 @@
  */
 package org.olat.registration;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.ValidationError;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
+import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
@@ -34,6 +37,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.helpers.Settings;
 import org.olat.core.util.StringHelper;
+import org.olat.user.UserPropertiesConfig;
+import org.olat.user.propertyhandlers.Generic127CharTextPropertyHandler;
+import org.olat.user.propertyhandlers.UserPropertyHandler;
 
 /**
  * Admin panel to configure the registration settings: should link appear on the login page...
@@ -45,24 +51,52 @@ public class RegistrationAdminController extends FormBasicController {
 	private MultipleSelectionElement registrationElement;
 	private MultipleSelectionElement registrationLinkElement;
 	private MultipleSelectionElement registrationLoginElement;
+	private MultipleSelectionElement staticPropElement;
+	private SingleSelection propertyElement;
+	private TextElement propertyValueElement;
 	private TextElement exampleElement;
 	private TextElement domainListElement;
 	private FormLayoutContainer domainsContainer;
+	private FormLayoutContainer staticPropContainer;
 	
 	private static final String[] enableRegistrationKeys = new String[]{ "on" };
 	private static final String[] enableRegistrationValues = new String[1];
+	private String[] propertyKeys, propertyValues;
 	
 	private final RegistrationModule registrationModule;
 	private final RegistrationManager registrationManager;
+	private final UserPropertiesConfig userPropertiesConfig;
 	
 	public RegistrationAdminController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl, "admin");
 		
 		registrationModule = CoreSpringFactory.getImpl(RegistrationModule.class);
 		registrationManager = CoreSpringFactory.getImpl(RegistrationManager.class);
-		
+		userPropertiesConfig = CoreSpringFactory.getImpl(UserPropertiesConfig.class);
+		//decorate the translator
+		setTranslator(userPropertiesConfig.getTranslator(getTranslator()));
+
 		enableRegistrationValues[0] = translate("admin.enableRegistration.on");
 		
+		List<UserPropertyHandler> allPropertyHandlers = userPropertiesConfig.getAllUserPropertyHandlers();
+		List<UserPropertyHandler> propertyHandlers = new ArrayList<UserPropertyHandler>(allPropertyHandlers.size());
+		for(UserPropertyHandler handler:allPropertyHandlers) {
+			if(handler instanceof Generic127CharTextPropertyHandler) {
+				propertyHandlers.add(handler);
+			}
+		}
+
+		propertyKeys = new String[propertyHandlers.size() + 1];
+		propertyValues = new String[propertyHandlers.size() + 1];
+		int count = 0;
+		//Translator translator = userPropertiesConfig.getTranslator(getTranslator());
+		propertyKeys[0] = "";
+		propertyValues[0] = "";
+		for(UserPropertyHandler propertyHandler:propertyHandlers) {
+			propertyKeys[1 + count] = propertyHandler.getName();
+			propertyValues[1 + count++] = translate(propertyHandler.i18nFormElementLabelKey());
+		}
+		
 		initForm(ureq);
 	}
 
@@ -105,8 +139,32 @@ public class RegistrationAdminController extends FormBasicController {
 		uifactory.addFormSubmitButton("save", buttonGroupLayout);
 		formLayout.add(buttonGroupLayout);
 		
-		updateUI();
+		//static property
+		staticPropContainer = FormLayoutContainer.createDefaultFormLayout("domains", getTranslator());
+		staticPropContainer.setRootForm(mainForm);
+		staticPropContainer.contextPut("off_title", translate("admin.registration.staticprop.title"));
+		formLayout.add(staticPropContainer);
+		
+		uifactory.addStaticTextElement("admin.registration.staticprop.error", null, translate("admin.registration.staticprop.desc"), staticPropContainer);
+		
+		staticPropElement = uifactory.addCheckboxesHorizontal("enable.staticprop", "admin.enableStaticProp", staticPropContainer, enableRegistrationKeys, enableRegistrationValues, null);
+		staticPropElement.addActionListener(this, FormEvent.ONCHANGE);
+		staticPropElement.select("on", registrationModule.isStaticPropertyMappingEnabled());
+
+		propertyElement = uifactory.addDropdownSingleselect("property", "admin.registration.property", staticPropContainer, propertyKeys, propertyValues, null);
+		String propertyName = registrationModule.getStaticPropertyMappingName();
+		UserPropertyHandler handler = userPropertiesConfig.getPropertyHandler(propertyName);
+		if(handler != null) {
+			propertyElement.select(handler.getName(), true);
+		} else {
+			propertyElement.select("", true);
+		}
+		propertyElement.addActionListener(this, FormEvent.ONCHANGE);
+		
+		String propertyValue = registrationModule.getStaticPropertyMappingValue();
+		propertyValueElement = uifactory.addTextElement("admin.registration.prop.value", "admin.registration.propertyValue", 255, propertyValue, staticPropContainer);
 		
+		updateUI();	
 	}
 	
 	@Override
@@ -126,6 +184,9 @@ public class RegistrationAdminController extends FormBasicController {
 		} else if(source == registrationLoginElement) {
 			registrationModule.setSelfRegistrationLoginEnabled(registrationLoginElement.isSelected(0));
 			updateUI();
+		} else if (source == staticPropElement) {
+			registrationModule.setStaticPropertyMappingEnabled(staticPropElement.isSelected(0));
+			updateUI();
 		}
 		
 		super.formInnerEvent(ureq, source, event);
@@ -141,9 +202,13 @@ public class RegistrationAdminController extends FormBasicController {
 		
 		boolean enableDomains = enableMain && (registrationLinkElement.isSelected(0) || registrationLoginElement.isSelected(0));
 		domainsContainer.setVisible(enableDomains);
+		
+		//static prop
+		staticPropContainer.setVisible(enableMain);
+		boolean enabledProp = staticPropElement.isSelected(0);
+		propertyElement.setVisible(enableMain && enabledProp);
+		propertyValueElement.setVisible(enableMain && enabledProp);
 	}
-	
-	
 
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
@@ -164,6 +229,24 @@ public class RegistrationAdminController extends FormBasicController {
 				allOk &= false;
 			}
 		}
+		
+		if(staticPropElement.isSelected(0)) {
+			if(propertyElement.isOneSelected()) {
+				String propertyName = propertyElement.getSelectedKey();
+				String value = propertyValueElement.getValue();
+				UserPropertyHandler handler = userPropertiesConfig.getPropertyHandler(propertyName);
+				ValidationError validationError = new ValidationError();
+				boolean valid = handler.isValidValue(value, validationError, getLocale());
+				if(!valid) {
+					String errorKey = validationError.getErrorKey();
+					if(errorKey == null) {
+						propertyValueElement.setErrorKey("admin.registration.propertyValue.error", null);
+					} else {
+						propertyValueElement.setErrorKey(errorKey, null);
+					}
+				}
+			}
+		}
 
 		return allOk && super.validateFormLogic(ureq);
 	}
@@ -176,6 +259,14 @@ public class RegistrationAdminController extends FormBasicController {
 		
 		String domains = domainListElement.getValue();
 		registrationModule.setDomainListRaw(domains);
+		
+		registrationModule.setStaticPropertyMappingEnabled(staticPropElement.isSelected(0));
+		if(propertyElement.isOneSelected()) {
+			registrationModule.setStaticPropertyMappingName(propertyElement.getSelectedKey());
+		} else {
+			registrationModule.setStaticPropertyMappingName(null);
+		}
+		registrationModule.setStaticPropertyMappingValue(propertyValueElement.getValue());
 	}
 	
 	private String generateExampleCode() {
diff --git a/src/main/java/org/olat/registration/RegistrationController.java b/src/main/java/org/olat/registration/RegistrationController.java
index 4d96ea17b9a..a7b57bf910c 100644
--- a/src/main/java/org/olat/registration/RegistrationController.java
+++ b/src/main/java/org/olat/registration/RegistrationController.java
@@ -55,6 +55,7 @@ import org.olat.core.id.User;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.i18n.I18nManager;
@@ -63,6 +64,7 @@ import org.olat.core.util.mail.MailerResult;
 import org.olat.core.util.mail.manager.MailManager;
 import org.olat.dispatcher.LocaleNegotiator;
 import org.olat.user.UserManager;
+import org.olat.user.UserPropertiesConfig;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 
 /**
@@ -405,6 +407,24 @@ public class RegistrationController extends BasicController implements Activatea
 			// update other user properties from form
 			List<UserPropertyHandler> userPropertyHandlers = um.getUserPropertyHandlersFor(RegistrationForm2.USERPROPERTIES_FORM_IDENTIFIER, false);
 			User persistedUser = persistedIdentity.getUser();
+			
+			//add eventually static value
+			UserPropertiesConfig userPropertiesConfig = CoreSpringFactory.getImpl(UserPropertiesConfig.class);
+			RegistrationModule registrationModule = CoreSpringFactory.getImpl(RegistrationModule.class);
+			if(registrationModule.isStaticPropertyMappingEnabled()) {
+				String propertyName = registrationModule.getStaticPropertyMappingName();
+				String propertyValue = registrationModule.getStaticPropertyMappingValue();
+				if(StringHelper.containsNonWhitespace(propertyName)
+						&& StringHelper.containsNonWhitespace(propertyValue)
+						&& userPropertiesConfig.getPropertyHandler(propertyName) != null) {
+					try {
+						persistedUser.setProperty(propertyName, propertyValue);
+					} catch (Exception e) {
+						logError("Cannot set the static property value", e);
+					}
+				}
+			}
+
 			for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) {
 				FormItem fi = registrationForm.getPropFormItem(userPropertyHandler.getName());
 				userPropertyHandler.updateUserFromFormItem(persistedUser, fi);
diff --git a/src/main/java/org/olat/registration/RegistrationModule.java b/src/main/java/org/olat/registration/RegistrationModule.java
index a57b0a08745..760c723eae8 100644
--- a/src/main/java/org/olat/registration/RegistrationModule.java
+++ b/src/main/java/org/olat/registration/RegistrationModule.java
@@ -50,6 +50,9 @@ import org.olat.core.util.mail.EmailAddressValidator;
 public class RegistrationModule extends AbstractOLATModule {
 	// registration config
 	private static final String CONFIG_SELFREGISTRATION = "enableSelfregistration";
+	private static final String CONFIG_STATIC_PROPERTY_MAPPING = "enableStaticPropertyMapping";
+	private static final String CONFIG_STATIC_PROPERTY_MAPPING_KEY = "staticPropertyMapping";
+	private static final String CONFIG_STATIC_PROPERTY_MAPPING_VAL = "staticPropertyMappingValue";
 	private static final String CONFIG_SELFREGISTRATION_LINK = "enableSelfregistrationLink";
 	private static final String CONFIG_SELFREGISTRATION_LOGIN = "enableSelfregistrationLogin";
 	private static final String CONFIG_REGISTRATION_NOTIFICATION ="registrationNotificationEnabled";
@@ -57,8 +60,11 @@ public class RegistrationModule extends AbstractOLATModule {
 	private boolean selfRegistrationEnabled;
 	private boolean selfRegistrationLinkEnabled;
 	private boolean selfRegistrationLoginEnabled;
+	private boolean staticPropertyMappingEnabled;
 	private String registrationNotificationEmail;
 	private String domainList;
+	private String staticPropertyMappingName;
+	private String staticPropertyMappingValue;
 	
 	// disclaimer config
 	private static final String CONFIG_DISCLAIMER = "disclaimerEnabled";
@@ -97,6 +103,36 @@ public class RegistrationModule extends AbstractOLATModule {
 		setStringProperty("registration.enabled", value, true);
 	}
 	
+	/**
+	 * @return true if self registration is turned on, false otherwhise
+	 */
+	public boolean isStaticPropertyMappingEnabled(){
+	    return staticPropertyMappingEnabled;
+	}
+	
+	public void setStaticPropertyMappingEnabled(boolean enable) {
+		String value = enable ? "true" : "false";
+		setStringProperty("static.prop.mapping.enabled", value, true);
+	}
+	
+	public String getStaticPropertyMappingName() {
+    return staticPropertyMappingName;
+	}
+
+	public void setStaticPropertyMappingName(String value) {
+		value = StringHelper.containsNonWhitespace(value) ? value : "";
+		setStringProperty("static.prop.mapping", value, true);
+	}
+	
+	public String getStaticPropertyMappingValue() {
+    return staticPropertyMappingValue;
+	}
+
+	public void setStaticPropertyMappingValue(String value) {
+		value = StringHelper.containsNonWhitespace(value) ? value : "";
+		setStringProperty("static.prop.mapping.value", value, true);
+	}
+	
 	public boolean isSelfRegistrationLinkEnabled(){
     return selfRegistrationLinkEnabled;
 	}
@@ -195,6 +231,20 @@ public class RegistrationModule extends AbstractOLATModule {
 		if(StringHelper.containsNonWhitespace(domainObj)) {
 			domainList = domainObj;
 		}
+
+		//static property mapping enabled/disabled
+		String enabledPropObj = getStringPropertyValue("static.prop.mapping.enabled", true);
+		if(StringHelper.containsNonWhitespace(enabledPropObj)) {
+			staticPropertyMappingEnabled = "true".equals(enabledPropObj);
+		}
+		String propKeyObj = getStringPropertyValue("static.prop.mapping", true);
+		if(StringHelper.containsNonWhitespace(propKeyObj)) {
+			staticPropertyMappingName = propKeyObj;
+		}
+		String propValueObj = getStringPropertyValue("static.prop.mapping.value", true);
+		if(StringHelper.containsNonWhitespace(propValueObj)) {
+			staticPropertyMappingValue = propValueObj;
+		}
 	}
 
 	@Override
@@ -229,6 +279,10 @@ public class RegistrationModule extends AbstractOLATModule {
 		// optional disclaimer elements
 		additionalCheckbox = getBooleanConfigParameter(CONFIG_ADDITIONAL_CHECKBOX, false);
 		additionaLinkText = getBooleanConfigParameter(CONFIG_ADDITIONAL_LINK, false);
+
+		staticPropertyMappingEnabled = getBooleanConfigParameter(CONFIG_STATIC_PROPERTY_MAPPING, false);
+		staticPropertyMappingName = getStringConfigParameter(CONFIG_STATIC_PROPERTY_MAPPING_KEY, "", true);
+		staticPropertyMappingValue = getStringConfigParameter(CONFIG_STATIC_PROPERTY_MAPPING_VAL, "", true);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties
index af4353930e7..5fd100fc73e 100644
--- a/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties
@@ -11,6 +11,12 @@ admin.registration.domains.title=Einschr
 admin.registration.domains.desc=Die Selbtregistration kann optional auf eine oder mehrere Domänen eingeschränkt werden. Um diese Funktion zu aktivieren fügen Sie eine Liste von Domänen an z.B: openolat.com, *olat.org, hotmail.com
 admin.registration.domains=Dom\u00E4nenliste
 admin.registration.domains.error=Diese Dom\u00E4nen sind nicht g\u00FCltig: {0}
+admin.registration.staticprop.title=User property mapping
+admin.registration.staticprop.desc=Optionally a user property can be set to a default value after self registration. This can be used to easily identify users who self-registred and separate them e.g. from LDAP users.
+admin.enableStaticProp=Activate user property mapping
+admin.registration.property=User property name
+admin.registration.propertyValue=User property value
+admin.registration.propertyValue.error=Invalid user property value
 disclaimer.acknowledged=<b>Ich habe die Nutzungsbedingungen gelesen, verstanden und stimme ihnen zu.</b>
 disclaimer.additionalcheckbox=<b>Ich bin mit der Datenspeicherung einverstanden.</b>
 disclaimer.additionallinktext=Nutzungsbedingungen (PDF Dokument)
diff --git a/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties
index 81e3b2f1f84..e75f944f5df 100644
--- a/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties
@@ -11,6 +11,12 @@ admin.registration.domains.title=Domain limitation
 admin.registration.domains.desc=Optionally the self registration can be limited to one or multiple domains. To activate this feature add a list of domains into the form below, e.g. : openolat.com, *olat.org, hotmail.com
 admin.registration.domains=List of domains
 admin.registration.domains.error=The following domains are not valid: {0}
+admin.registration.staticprop.title=User property mapping
+admin.registration.staticprop.desc=Optionally a user property can be set to a default value after self registration. This can be used to easily identify users who self-registred and separate them e.g. from LDAP users.
+admin.enableStaticProp=Activate user property mapping
+admin.registration.property=User property name
+admin.registration.propertyValue=User property value
+admin.registration.propertyValue.error=Invalid user property value
 disclaimer.acknowledged=<b>I have read your terms of use, do understand and agree.</b>
 disclaimer.additionalcheckbox=<b>I agree on the terms of data storage</b>
 disclaimer.additionallinktext=Terms of use (PDF document)
diff --git a/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java b/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java
index f2e7390f41f..32712b9c738 100644
--- a/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java
+++ b/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java
@@ -82,7 +82,11 @@ public class MSNPropertyHandler extends Generic127CharTextPropertyHandler {
 			return false;
 		}
 		if (StringHelper.containsNonWhitespace(value)) {
-			return value.length() <= MSN_NAME_MAX_LENGTH;
+			boolean valid = value.length() <= MSN_NAME_MAX_LENGTH;
+			if(!valid && validationError != null) {
+				validationError.setErrorKey("form.name.msn.error");
+			}
+			return valid;
 		}
 		return true;
 	}
-- 
GitLab