com.sonicle.webtop.core.sdk.UserProfile.java Source code

Java tutorial

Introduction

Here is the source code for com.sonicle.webtop.core.sdk.UserProfile.java

Source

/*
 * WebTop Services is a Web Application framework developed by Sonicle S.r.l.
 * Copyright (C) 2014 Sonicle S.r.l.
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by
 * the Free Software Foundation with the addition of the following permission
 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
 * WORK IN WHICH THE COPYRIGHT IS OWNED BY SONICLE, SONICLE DISCLAIMS THE
 * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program; if not, see http://www.gnu.org/licenses or write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301 USA.
 *
 * You can contact Sonicle S.r.l. at email address sonicle@sonicle.com
 *
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 *
 * In accordance with Section 7(b) of the GNU Affero General Public License
 * version 3, these Appropriate Legal Notices must retain the display of the
 * Sonicle logo and Sonicle copyright notice. If the display of the logo is not
 * reasonably feasible for technical reasons, the Appropriate Legal Notices must
 * display the words "Copyright (C) 2014 Sonicle S.r.l.".
 */
package com.sonicle.webtop.core.sdk;

import com.sonicle.commons.InternetAddressUtils;
import com.sonicle.commons.LangUtils;
import com.sonicle.commons.db.DbUtils;
import com.sonicle.security.AuthenticationDomain;
import com.sonicle.security.DomainAccount;
import com.sonicle.security.Principal;
import com.sonicle.webtop.core.CoreManager;
import com.sonicle.webtop.core.app.WT;
import com.sonicle.webtop.core.bol.OUser;
import com.sonicle.webtop.core.bol.OUserInfo;
import com.sonicle.webtop.core.dal.UserDAO;
import com.sonicle.webtop.core.model.ProfileI18n;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.sql.Connection;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.mail.internet.InternetAddress;
import org.apache.commons.codec.binary.Base32;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTimeZone;
import org.slf4j.Logger;

/**
 *
 * @author malbinola
 */
public final class UserProfile {
    private static final Logger logger = WT.getLogger(UserProfile.class);
    private final CoreManager core;
    private final Principal principal;
    private OUser user;

    public UserProfile(CoreManager core, Principal principal) {
        this.core = core;
        this.principal = principal;

        try {
            logger.debug("Initializing UserProfile");
            loadDetails();
        } catch (Throwable t) {
            logger.error("Unable to initialize UserProfile", t);
            //throw new Exception("Unable to initialize UserProfile", t);
        }
    }

    private void loadDetails() throws Exception {
        Connection con = null;

        try {
            con = WT.getCoreConnection();
            UserDAO udao = UserDAO.getInstance();

            // Retrieves corresponding user using principal details
            user = udao.selectByDomainUser(con, principal.getDomainId(), principal.getUserId());
            if (user == null)
                throw new WTException("Unable to find a user for principal [{0}, {1}]", principal.getDomainId(),
                        principal.getUserId());

            // If necessary, compute secret key and updates it
            if (StringUtils.isEmpty(user.getSecret())) {
                logger.debug("Building new secret key");
                String secret = "0123456789101112";
                try {
                    secret = generateSecretKey();
                } catch (NoSuchAlgorithmException ex) {
                    /* Do nothing... */ }
                user.setSecret(secret);
                udao.updateSecretByDomainUser(con, user.getDomainId(), user.getUserId(), secret);
            }

        } catch (Exception ex) {
            throw ex;
        } finally {
            DbUtils.closeQuietly(con);
        }
    }

    public void refresh() throws Exception {
        loadDetails();
    }

    public Principal getPrincipal() {
        return principal;
    }

    public UserProfileId getId() {
        return new UserProfileId(principal.getName());
    }

    public String getStringId() {
        return principal.getName();
    }

    public String getUserId() {
        return principal.getUserId();
    }

    public String getDomainId() {
        return principal.getDomainId();
    }

    public String getMailcardId() {
        AuthenticationDomain ad = principal.getAuthenticationDomain();
        return MessageFormat.format("{0}@{1}", principal.getUserId(), ad.getInternetName());
    }

    public String getSecret() {
        return user.getSecret();
    }

    public Data getData() {
        return WT.getUserData(getId());
    }

    public Locale getLocale() {
        return WT.getUserData(getId()).getLocale();
    }

    public String getLanguageTag() {
        return WT.getUserData(getId()).getLanguageTag();
    }

    public DateTimeZone getTimeZone() {
        return WT.getUserData(getId()).getTimeZone();
    }

    public String getDisplayName() {
        return WT.getUserData(getId()).getDisplayName();
    }

    public String getEmailAddress() {
        return WT.getUserData(getId()).getEmailAddress();
    }

    public String getFullEmailAddress() {
        return WT.getUserData(getId()).getFullEmailAddress();
    }

    public static class Data {
        private DomainAccount internetAccount;
        private String displayName;
        private String languageTag;
        private Locale locale;
        private String timezoneId;
        private DateTimeZone timezone;
        private int startDay;
        private String shortDateFormat;
        private String longDateFormat;
        private String shortTimeFormat;
        private String longTimeFormat;
        private InternetAddress profileEmail;
        private InternetAddress personalEmail;

        public Data() {
        }

        public Data(DomainAccount internetAccount, String displayName, String languageTag, String timezone,
                int startDay, String shortDateFormat, String longDateFormat, String shortTimeFormat,
                String longTimeFormat, InternetAddress profileEmail, InternetAddress personalEmail) {
            this.internetAccount = internetAccount;
            this.displayName = displayName;
            this.languageTag = languageTag;
            this.locale = LangUtils.languageTagToLocale(languageTag);
            this.timezoneId = timezone;
            this.timezone = DateTimeZone.forID(timezone);
            this.startDay = startDay;
            this.shortDateFormat = shortDateFormat;
            this.longDateFormat = longDateFormat;
            this.shortTimeFormat = shortTimeFormat;
            this.longTimeFormat = longTimeFormat;
            this.profileEmail = profileEmail;
            this.personalEmail = personalEmail;
        }

        public DomainAccount getInternetAccount() {
            return internetAccount;
        }

        public String getDisplayName() {
            return displayName;
        }

        public String getLanguageTag() {
            return languageTag;
        }

        public Locale getLocale() {
            return locale;
        }

        public String getTimeZoneId() {
            return timezoneId;
        }

        public DateTimeZone getTimeZone() {
            return timezone;
        }

        public int getStartDay() {
            return startDay;
        }

        public String getShortDateFormat() {
            return shortDateFormat;
        }

        public String getLongDateFormat() {
            return longDateFormat;
        }

        public String getShortTimeFormat() {
            return shortTimeFormat;
        }

        public String getLongTimeFormat() {
            return longTimeFormat;
        }

        public InternetAddress getProfileEmail() {
            return profileEmail;
        }

        public String getProfileEmailAddress() {
            return profileEmail.getAddress();
        }

        public String getProfileFullEmailAddress() {
            return InternetAddressUtils.toFullAddress(profileEmail);
        }

        public InternetAddress getPersonalEmail() {
            return personalEmail;
        }

        public String getPersonalEmailAddress() {
            return personalEmail.getAddress();
        }

        public String getPersonalFullEmailAddress() {
            return InternetAddressUtils.toFullAddress(personalEmail);
        }

        public ProfileI18n toProfileI18n() {
            return toProfileI18n(false);
        }

        public ProfileI18n toProfileI18n(boolean longDateTimeFormat) {
            if (longDateTimeFormat) {
                return new ProfileI18n(this.getLocale(), this.getTimeZone(), this.getLongDateFormat(),
                        this.getLongTimeFormat());
            } else {
                return new ProfileI18n(this.getLocale(), this.getTimeZone(), this.getShortDateFormat(),
                        this.getShortTimeFormat());
            }
        }

        /**
         * @return 
         * @deprecated use {@link #getPersonalEmail()} instead.
         */
        @Deprecated
        public InternetAddress getEmail() {
            return getPersonalEmail();
        }

        /**
         * @return 
         * @deprecated use {@link #getPersonalEmailAddress()} instead.
         */
        @Deprecated
        public String getEmailAddress() {
            return getPersonalEmailAddress();
        }

        /**
         * @return 
         * @deprecated use {@link #getPersonalFullEmailAddress()} instead.
         */
        @Deprecated
        public String getFullEmailAddress() {
            return getPersonalFullEmailAddress();
        }
    }

    public static class PersonalInfo {
        private String title = null;
        private String firstName = null;
        private String lastName = null;
        private String nickname = null;
        private String gender = null;
        private String email = null;
        private String telephone = null;
        private String fax = null;
        private String pager = null;
        private String mobile = null;
        private String address = null;
        private String city = null;
        private String postalCode = null;
        private String state = null;
        private String country = null;
        private String company = null;
        private String function = null;
        private String custom01 = null;
        private String custom02 = null;
        private String custom03 = null;

        public PersonalInfo() {
        }

        public PersonalInfo(OUserInfo o) {
            setTitle(o.getTitle());
            setFirstName(o.getFirstName());
            setLastName(o.getLastName());
            setNickname(o.getNickname());
            setGender(o.getGender());
            setEmail(o.getEmail());
            setTelephone(o.getTelephone());
            setFax(o.getFax());
            setPager(o.getPager());
            setMobile(o.getMobile());
            setAddress(o.getAddress());
            setCity(o.getCity());
            setPostalCode(o.getPostalCode());
            setState(o.getState());
            setCountry(o.getCountry());
            setCompany(o.getCompany());
            setFunction(o.getFunction());
            setCustom01(o.getCustom1());
            setCustom02(o.getCustom2());
            setCustom03(o.getCustom3());
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getNickname() {
            return nickname;
        }

        public void setNickname(String nickname) {
            this.nickname = nickname;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }

        public String getTelephone() {
            return telephone;
        }

        public void setTelephone(String telephone) {
            this.telephone = telephone;
        }

        public String getFax() {
            return fax;
        }

        public void setFax(String fax) {
            this.fax = fax;
        }

        public String getPager() {
            return pager;
        }

        public void setPager(String pager) {
            this.pager = pager;
        }

        public String getMobile() {
            return mobile;
        }

        public void setMobile(String mobile) {
            this.mobile = mobile;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public String getPostalCode() {
            return postalCode;
        }

        public void setPostalCode(String postalCode) {
            this.postalCode = postalCode;
        }

        public String getState() {
            return state;
        }

        public void setState(String state) {
            this.state = state;
        }

        public String getCountry() {
            return country;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        public String getCompany() {
            return company;
        }

        public void setCompany(String company) {
            this.company = company;
        }

        public String getFunction() {
            return function;
        }

        public void setFunction(String function) {
            this.function = function;
        }

        public String getCustom01() {
            return custom01;
        }

        public void setCustom01(String custom01) {
            this.custom01 = custom01;
        }

        public String getCustom02() {
            return custom02;
        }

        public void setCustom02(String custom02) {
            this.custom02 = custom02;
        }

        public String getCustom03() {
            return custom03;
        }

        public void setCustom03(String custom03) {
            this.custom03 = custom03;
        }

        public Map toMap() {
            HashMap<String, String> map = new HashMap();
            map.put("title", title);
            map.put("firstName", firstName);
            map.put("lastName", lastName);
            map.put("nickname", nickname);
            map.put("gender", gender);
            map.put("email", email);
            map.put("telephone", telephone);
            map.put("fax", fax);
            map.put("pager", pager);
            map.put("mobile", mobile);
            map.put("address", address);
            map.put("city", city);
            map.put("postalCode", postalCode);
            map.put("state", state);
            map.put("country", country);
            map.put("company", company);
            map.put("function", function);
            map.put("custom1", custom01);
            map.put("custom2", custom02);
            map.put("custom3", custom03);
            return map;
        }

        public void setValues(Map<String, Object> map) {
            title = String.valueOf(LangUtils.ifValue(map, "title", title));
            firstName = String.valueOf(LangUtils.ifValue(map, "firstName", firstName));
            lastName = String.valueOf(LangUtils.ifValue(map, "lastName", lastName));
            nickname = String.valueOf(LangUtils.ifValue(map, "nickname", nickname));
            gender = String.valueOf(LangUtils.ifValue(map, "gender", gender));
            email = String.valueOf(LangUtils.ifValue(map, "email", email));
            telephone = String.valueOf(LangUtils.ifValue(map, "telephone", telephone));
            fax = String.valueOf(LangUtils.ifValue(map, "fax", fax));
            pager = String.valueOf(LangUtils.ifValue(map, "pager", pager));
            mobile = String.valueOf(LangUtils.ifValue(map, "mobile", mobile));
            address = String.valueOf(LangUtils.ifValue(map, "address", address));
            city = String.valueOf(LangUtils.ifValue(map, "city", city));
            postalCode = String.valueOf(LangUtils.ifValue(map, "postalCode", postalCode));
            state = String.valueOf(LangUtils.ifValue(map, "state", state));
            country = String.valueOf(LangUtils.ifValue(map, "country", country));
            company = String.valueOf(LangUtils.ifValue(map, "company", company));
            function = String.valueOf(LangUtils.ifValue(map, "function", function));
            custom01 = String.valueOf(LangUtils.ifValue(map, "custom1", custom01));
            custom02 = String.valueOf(LangUtils.ifValue(map, "custom2", custom02));
            custom03 = String.valueOf(LangUtils.ifValue(map, "custom3", custom03));
        }
    }

    private String generateSecretKey() throws NoSuchAlgorithmException {
        byte[] buffer = new byte[80 / 8];
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.nextBytes(buffer);
        byte[] secretKey = Arrays.copyOf(buffer, 80 / 8);
        byte[] encodedKey = new Base32().encode(secretKey);
        return new String(encodedKey);
    }
}