Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
AbstractUserPropertyHandler.java 5.80 KiB
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/

package org.olat.user;

import java.lang.reflect.Field;
import java.util.Locale;

import javax.persistence.Column;

import org.olat.core.commons.persistence.DBFactory;
import org.olat.core.gui.components.table.ColumnDescriptor;
import org.olat.core.gui.components.table.DefaultColumnDescriptor;
import org.olat.core.id.User;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.StringHelper;
import org.olat.user.propertyhandlers.UserPropertyHandler;

/**
 * Desciption:
 * <p>
 * The user field represents an attribute of a known OLAT user.
 * <p>
 * @author Carsten Weisse, Florian Gnägi
 */
public abstract class AbstractUserPropertyHandler implements UserPropertyHandler {
	private static final OLog log = Tracing.createLoggerFor(AbstractUserPropertyHandler.class);
	
	private String name; 
	private String group;
	private boolean deletable = true; // default
	private String databaseColumnName;

	/**
	 * @see org.olat.core.id.UserField#getUserFieldValue(org.olat.core.id.User, java.util.Locale)
	 */
	@Override
	public String getUserProperty(User user, Locale locale) {
		return getInternalValue(user);
	}

	/**
	 * @see org.olat.core.id.UserField#getUserFieldValueAsHTML(org.olat.core.id.User, java.util.Locale)
	 */
	@Override
	public String getUserPropertyAsHTML(User user, Locale locale) {
		return StringHelper.escapeHtml(getUserProperty(user, locale));
	}

	/**
	 * @see org.olat.core.id.UserField#setUserFieldValue(org.olat.core.id.User, java.lang.String)
	 */
	@Override
	public void setUserProperty(User user, String value) {
		setInternalValue(user, value);
	}

	/**
	 * @see org.olat.core.id.UserField#getName()
	 */
	@Override
	public String getName() {
		return name;
	}
	
	public String getDatabaseColumnName() {
		return databaseColumnName;
	}

	/**
	 * @see org.olat.core.id.UserField#getGroup()
	 */
	@Override
	public String getGroup() {
		return group;
	}

	/**
	 * @see org.olat.core.id.UserField#i18nFormElementLabelKey()
	 */
	@Override
	public String i18nFormElementLabelKey() {
		return "form.name." + getName();
	}

	/**
	 * @see org.olat.core.id.UserField#i18nFormElementGroupKey()
	 */
	@Override
	public String i18nFormElementGroupKey() {
		return "form.group." + getGroup();
	}

	/**
	 * @see org.olat.core.id.UserField#i18nColumnDescriptorLabelKey()
	 */
	@Override
	public String i18nColumnDescriptorLabelKey() {
		return "table.name." + getName();
	}
	
	/**
	 * @see org.olat.core.id.UserField#getColumnDescriptor(int, java.lang.String, java.util.Locale)
	 */
	@Override
	public ColumnDescriptor getColumnDescriptor(int position, String action, Locale locale) {
		return new DefaultColumnDescriptor(i18nColumnDescriptorLabelKey(), position, action, locale);		
	}

	/**
	 * @see org.olat.user.propertyhandlers.UserPropertyHandler#isDeletable()
	 */
	@Override
	public boolean isDeletable() {
		return deletable;
	}
	/**
	 * @return The non-i18-ified raw value from the database
	 */
	protected String getInternalValue(User user) {
		if (user instanceof UserImpl) {
			String value = ((UserImpl)user).getUserProperty(name);
			if("_".equals(value) && "oracle".equals(DBFactory.getInstance().getDbVendor())) {
				value = null;
			}
			return value;
		} else if (user != null) {
			return user.getProperty(name, null);
		}
		return null;
	}

	/**
	 * @param value The raw value in a 18n independent form
	 */
	protected void setInternalValue(User user, String value) {
		if (user instanceof UserImpl) {
			// remove fields with null or empty value from o_userfield table (hibernate)
			// sparse data storage
			if (value == null || value.length() == 0) {
				((UserImpl)user).setUserProperty(name, null);
			} else {
				((UserImpl)user).setUserProperty(name, value);
			}
		} else {
			log.warn("Set read-only value: " + name,  null);
		}
	}

	
	/**
	 * Returns the user field database key, name and value .
	 * @return String internal user field info
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		String quickinfo = "AbstractUserPropertyHandler("+this.getClass().getName()+")["+getName()+"]" ;
		return quickinfo + "," + super.toString();
	}

	/**
	 * Spring setter
	 * @param group
	 */
	@Override
	public void setGroup(String group) {
		this.group = group;
	}

	/**
	 * Spring setter
	 * @param isDeletable
	 */
	public void setDeletable(boolean deletable) {
		this.deletable = deletable;
	}

	/**
	 * Spring setter
	 * @param name
	 */
	public void setName(String name) {
		this.name = name;
		setInternalGetterSetter(name);
	}
	
	protected void setInternalGetterSetter(String name) {
		try {
			Field getter = UserImpl.class.getDeclaredField(name);
			getter.setAccessible(true);
			if(getter.isAnnotationPresent(Column.class)) {
				Column col = getter.getAnnotation(Column.class);
				databaseColumnName = col.name();
			}
		} catch (NoSuchFieldException | SecurityException e) {
			log.error("", e);
		}
	}
}