/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <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 the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <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>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.user.restapi;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.core.id.User;
import org.olat.core.id.UserConstants;
import org.olat.core.util.FileUtils;
import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper;
import org.olat.core.util.Util;
import org.olat.core.util.i18n.I18nModule;
import org.olat.user.DisplayPortraitManager;
import org.olat.user.HomePageConfig;
import org.olat.user.HomePageConfigManagerImpl;
import org.olat.user.UserManager;
import org.olat.user.propertyhandlers.DatePropertyHandler;
import org.olat.user.propertyhandlers.GenderPropertyHandler;
import org.olat.user.propertyhandlers.UserPropertyHandler;
/**
* Description:<br>
* Factory for object needed by the REST Api
*
* <P>
* Initial Date: 7 apr. 2010 <br>
* @author srosse, stephane.rosse@frentix.com
*/
public class UserVOFactory {
public static final String[] keys = new String[] { "male", "female", "-" };
public static UserVO get(Identity identity) {
return get(identity, I18nModule.getDefaultLocale(), false, false, false);
}
public static UserVO get(Identity identity, Locale locale) {
return get(identity, locale, false, false, false);
}
public static UserVO get(Identity identity, boolean allProperties, boolean isAdmin) {
return get(identity, I18nModule.getDefaultLocale(), allProperties, isAdmin, false);
}
public static UserVO get(Identity identity, Locale locale, boolean allProperties, boolean isAdmin, boolean withPortrait) {
if(locale == null) {
locale = I18nModule.getDefaultLocale();
}
UserVO userVO = new UserVO();
User user = identity.getUser();
userVO.setKey(identity.getKey());
if(identity != null) {
userVO.setLogin(identity.getName());
}
userVO.setExternalId(identity.getExternalId());
userVO.setFirstName(user.getProperty(UserConstants.FIRSTNAME, null));
userVO.setLastName(user.getProperty(UserConstants.LASTNAME, null));
userVO.setEmail(user.getProperty(UserConstants.EMAIL, null));
if(withPortrait) {
File portrait = DisplayPortraitManager.getInstance().getSmallPortrait(identity.getName());
if(portrait != null && portrait.exists()) {
try {
InputStream input = new FileInputStream(portrait);
byte[] datas = IOUtils.toByteArray(input);
FileUtils.closeSafely(input);
byte[] data64 = Base64.encodeBase64(datas);
userVO.setPortrait(new String(data64, "UTF8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
HomePageConfig hpc = isAdmin ? null : HomePageConfigManagerImpl.getInstance().loadConfigFor(identity.getName());
if(allProperties) {
UserManager um = UserManager.getInstance();
List<UserPropertyHandler> propertyHandlers = um.getUserPropertyHandlersFor(UserWebService.PROPERTY_HANDLER_IDENTIFIER, false);
for (UserPropertyHandler propertyHandler : propertyHandlers) {
String propName = propertyHandler.getName();
if(hpc != null && !hpc.isEnabled(propName)) {
continue;
}
if(!UserConstants.FIRSTNAME.equals(propName)
&& !UserConstants.LASTNAME.equals(propName)
&& !UserConstants.EMAIL.equals(propName)) {
String value = propertyHandler.getUserProperty(user, locale);
userVO.putProperty(propName, value);
}
}
}
return userVO;
}
public static ManagedUserVO getManaged(Identity identity) {
ManagedUserVO managedUserVo = new ManagedUserVO();
managedUserVo.setKey(identity.getKey());
managedUserVo.setLogin(identity.getName());
managedUserVo.setExternalId(identity.getExternalId());
return managedUserVo;
}
public static void post(User dbUser, UserVO user, Locale locale) {
UserManager um = UserManager.getInstance();
List<UserPropertyHandler> propertyHandlers = um.getUserPropertyHandlersFor(UserWebService.PROPERTY_HANDLER_IDENTIFIER, false);
dbUser.setProperty(UserConstants.FIRSTNAME, user.getFirstName());
dbUser.setProperty(UserConstants.LASTNAME, user.getLastName());
dbUser.setProperty(UserConstants.EMAIL, user.getEmail());
for(UserPropertyVO entry:user.getProperties()) {
for(UserPropertyHandler propertyHandler:propertyHandlers) {
if(entry.getName().equals(propertyHandler.getName())) {
String value = parseUserProperty(entry.getValue(), propertyHandler, locale);
String parsedValue;
if(propertyHandler instanceof DatePropertyHandler) {
parsedValue = formatDbDate(value, locale);
} else if(propertyHandler instanceof GenderPropertyHandler) {
parsedValue = parseGender(value, (GenderPropertyHandler)propertyHandler, locale);
} else {
parsedValue = propertyHandler.getStringValue(value, locale);
}
dbUser.setProperty(entry.getName(), parsedValue);
break;
}
}
}
}
public static String parseUserProperty(String value, UserPropertyHandler propertyHandler, Locale locale) {
String parsedValue;
if(propertyHandler instanceof DatePropertyHandler) {
parsedValue = parseDate(value, locale);
} else if(propertyHandler instanceof GenderPropertyHandler) {
parsedValue = parseGender(value, (GenderPropertyHandler)propertyHandler, locale);
} else {
parsedValue = propertyHandler.getStringValue(value, locale);
}
return parsedValue;
}
public static String formatDbUserProperty(String value, UserPropertyHandler propertyHandler, Locale locale) {
String formatedValue;
if(propertyHandler instanceof DatePropertyHandler) {
formatedValue = formatDbDate(value, locale);
} else if(propertyHandler instanceof GenderPropertyHandler) {
formatedValue = parseGender(value, (GenderPropertyHandler)propertyHandler, locale);
} else {
formatedValue = propertyHandler.getStringValue(value, locale);
}
return formatedValue;
}
/**
* Allow the date to be in the raw form (yyyyMMdd) or translated
* to be translated
* @param value
* @param handler
* @param locale
* @return
*/
public static final String parseDate(String value, Locale locale) {
if(!StringHelper.containsNonWhitespace(value)) {
return value;
}
boolean raw = true;
for(int i=0; i<value.length(); i++) {
if(!Character.isDigit(value.charAt(i))) {
raw = false;
break;
}
}
if(raw) {
try {
DateFormat formater = new SimpleDateFormat("yyyyMMdd", Locale.GERMAN);
Date date = formater.parse(value);
value = Formatter.getInstance(locale).formatDate(date);
} catch (ParseException e) {
/* silently failed */
}
}
return value;
}
/**
* Allow the date to be in the localized form or not
* @param value
* @param handler
* @param locale
* @return
*/
public static final String formatDbDate(String value, Locale locale) {
if(!StringHelper.containsNonWhitespace(value)) {
return value;
}
boolean raw = true;
for(int i=0; i<value.length(); i++) {
if(!Character.isDigit(value.charAt(i))) {
raw = false;
break;
}
}
if(raw) {
return value;
}
try {
DateFormat outFormater = new SimpleDateFormat("yyyyMMdd", Locale.GERMAN);
DateFormat inFormater = DateFormat.getDateInstance(DateFormat.SHORT, locale);
Date date = inFormater.parse(value);
value = outFormater.format(date);
} catch (ParseException e) {
/* silently failed */
}
return value;
}
/**
* Allow the value of gender to be in the raw form (male, female key word) or
* to be translated
* @param value
* @param handler
* @param locale
* @return
*/
public static final String parseGender(String value, GenderPropertyHandler handler, Locale locale) {
if(!StringHelper.containsNonWhitespace(value)) {
value = "-";
}
int index = Arrays.binarySearch(UserVOFactory.keys, value);
if(index < 0) {
//try to translate them
boolean found = false;
Translator trans = Util.createPackageTranslator(GenderPropertyHandler.class, locale);
for(String key:keys) {
String translation = trans.translate(handler.i18nFormElementLabelKey() + "." + key);
if(translation.equals(value)) {
value = key;
found = true;
break;
}
}
if(!found && !locale.equals(I18nModule.getDefaultLocale())) {
//very last chance, try with the default locale
trans = Util.createPackageTranslator(GenderPropertyHandler.class, I18nModule.getDefaultLocale());
for(String key:keys) {
String translation = trans.translate(handler.i18nFormElementLabelKey() + "." + key);
if(translation.equals(value)) {
value = key;
found = true;
break;
}
}
}
}
return value;
}
}