org.exoplatform.social.webui.profile.UIExperienceSection.java Source code

Java tutorial

Introduction

Here is the source code for org.exoplatform.social.webui.profile.UIExperienceSection.java

Source

/**
 * Copyright (C) 2003-2007 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * 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 General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 */
package org.exoplatform.social.webui.profile;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.commons.lang.StringEscapeUtils;
import org.exoplatform.social.core.identity.model.Profile;
import org.exoplatform.social.webui.Utils;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormDateTimeInput;
import org.exoplatform.webui.form.UIFormInput;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;
import org.exoplatform.webui.form.validator.ExpressionValidator;
import org.exoplatform.webui.form.validator.PersonalNameValidator;

/**
 * Component manages all experience informations
 * (ex: company, position, professional...) of profile user.
 * This is one part of profile management beside contact, basic information.<br>
 *
 */

@ComponentConfigs({
        @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "classpath:groovy/social/webui/profile/UIExperienceSection.gtmpl", events = {
                @EventConfig(listeners = UIExperienceSection.EditActionListener.class, phase = Phase.DECODE),
                @EventConfig(listeners = UIExperienceSection.SaveActionListener.class),
                @EventConfig(listeners = UIExperienceSection.AddActionListener.class),
                @EventConfig(listeners = UIExperienceSection.RemoveActionListener.class),
                @EventConfig(listeners = UIProfileSection.CancelActionListener.class, phase = Phase.DECODE) }),
        @ComponentConfig(type = UICheckBoxInput.class, id = "UIFormCheckBoxEndDate", events = @EventConfig(phase = Phase.DECODE, listeners = UIExperienceSection.ShowHideEndDateActionListener.class)) })
public class UIExperienceSection extends UIProfileSection {

    /**
     * START DATE AFTER TODAY.
     */
    final public static String START_DATE_AFTER_TODAY = "UIExperienceSection.msg.StartDateAfterToday";

    /**
     * END DATE AFTER TODAY.
     */
    final public static String END_DATE_AFTER_TODAY = "UIExperienceSection.msg.EndDateAfterToday";

    /**
     * START DATE BEFORE END DATE.
     */
    final public static String STARTDATE_BEFORE_ENDDATE = "UIExperienceSection.msg.startDateBeforeEndDate";

    /**
     * DATE FORMAT.
     */
    final public static String DATE_FORMAT_MMDDYYYY = "MM/dd/yyyy";

    /** DATE TIME VALIDATE EXPRESSION. */
    private static final String DATETIME_REGEX = "^(\\d{1,2}\\/\\d{1,2}\\/\\d{1,4})\\s*(\\s+\\d{1,2}:\\d{1,2}:\\d{1,2})?$";

    /** MANDATORY START DATE MESSAGE. */
    private static final String INVALID_START_DATE_MANDATORY = "UIExperienceSection.msg.Invalid-startdate-mandatory";

    /** MANDATORY END DATE MESSAGE. */
    private static final String INVALID_END_DATE_MANDATORY = "UIExperienceSection.msg.Invalid-enddate-mandatory";

    /** INVALID FORMAT DATE TIME MESSAGE. */
    private static final String INVALID_START_DATE_FORMAT = "UIExperienceSection.msg.Invalid-startdate-format";

    /** INVALID FORMAT DATE TIME MESSAGE. */
    private static final String INVALID_END_DATE_FORMAT = "UIExperienceSection.msg.Invalid-enddate-format";

    /** INVALID COMPANY LENGTH MESSAGE. */
    private static final String INVALID_COMPANY_STRINGLENGTH = "UIExperienceSection.msg.Invalid-company-stringlength";

    /** MANDATORY COMPANY MESSAGE. */
    private static final String INVALID_COMPANY_MANDATORY = "UIExperienceSection.msg.Invalid-company-mandatory";

    /** INVALID POSITION LENGTH MESSAGE. */
    private static final String INVALID_POSITION_STRINGLENGTH = "UIExperienceSection.msg.Invalid-position-stringlength";

    /** MANDATORY POSITION MESSAGE. */
    private static final String INVALID_POSITION_MANDATORY = "UIExperienceSection.msg.Invalid-position-mandatory";

    /** Html attribute title. */
    private static final String HTML_ATTRIBUTE_TITLE = "title";

    /**
     * Number of components.
     */
    int expIdx = 0;

    /**
     * Gets number of component.<br>
     *
     * @return Number of components.
     */
    public int getExpCount() {
        return expIdx;
    }

    /**
     * Gets all the children.<br>
     */
    public List<UIComponent> getChilds() {
        return getChildren();
    }

    /**
     * Constructor.<br>
     *
     * @throws Exception
     */
    public UIExperienceSection() throws Exception {
        addChild(UITitleBar.class, null, null);
    }

    /**
     * Gets month of date time.<br>
     *
     * @param inDate Input date
     * @return Month of input date.
     * @throws ParseException
     */
    public int getMonth(String inDate) throws ParseException {
        if ((inDate == null) || (inDate.length() == 0)) {
            return 0;
        }
        Calendar calendar = getCalendar(inDate);

        return (calendar.get(Calendar.MONTH) + 1); // Month start from 0
    }

    /**
     * Gets date of date time.<br>
     *
     * @param inDate Input date
     * @return Date of input date.
     * @throws ParseException
     */
    public int getDate(String inDate) throws ParseException {
        if ((inDate == null) || (inDate.length() == 0)) {
            return 0;
        }
        Calendar calendar = getCalendar(inDate);

        return calendar.get(Calendar.DATE);
    }

    /**
     * Convert calendar to string.
     * 
     * @param cal
     * @return
     * @since 1.2.5
     */
    protected String calendarToString(Calendar cal) {
        String sDate = "";
        if (cal != null) {
            SimpleDateFormat sd = new SimpleDateFormat(DATE_FORMAT_MMDDYYYY, Locale.ENGLISH);
            sDate = sd.format(cal.getTime());
        }
        return sDate;
    }

    /**
     * Convert string to calendar.
     * 
     * @param sDate
     * @return
     * @since 1.2.5
     */
    protected Calendar stringToCalendar(String sDate) {
        try {
            SimpleDateFormat sd = new SimpleDateFormat(DATE_FORMAT_MMDDYYYY, Locale.ENGLISH);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(sd.parse(sDate));
            return calendar;
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * Display date time.
     * 
     * @param d
     * @return
     * @since 1.2.5
     * @throws ParseException
     */
    protected String displayDateTime(Object d) throws ParseException {
        Date date = this.stringToCalendar(d.toString()).getTime();
        Locale l = WebuiRequestContext.getCurrentInstance().getLocale();
        DateFormat sf = SimpleDateFormat.getDateInstance(DateFormat.LONG, l);
        return sf.format(date);
    }

    /**
     * Gets year of date time.<br>
     *
     * @param inDate Input date
     * @return Year of input date.
     * @throws ParseException
     */
    public int getYear(String inDate) throws ParseException {
        if ((inDate == null) || (inDate.length() == 0)) {
            return 0;
        }
        Calendar calendar = getCalendar(inDate);

        return calendar.get(Calendar.YEAR);
    }

    /**
     * Adds component when Add button is clicked. <br>
     */
    public static class AddActionListener extends EventListener<UIExperienceSection> {
        @Override
        public void execute(Event<UIExperienceSection> event) throws Exception {
            UIExperienceSection uiForm = event.getSource();
            uiForm.addUIFormInput();
        }
    }

    /**
     * Adds component when Add button is clicked. <br>
     */
    public static class RemoveActionListener extends EventListener<UIExperienceSection> {
        @Override
        public void execute(Event<UIExperienceSection> event) throws Exception {
            UIExperienceSection uiForm = event.getSource();
            String block = event.getRequestContext().getRequestParameter(OBJECTID);
            int blockIdx = Integer.parseInt(block);
            String companyId = null;
            String positionId = null;
            String descriptionId = null;
            String skillsId = null;
            String startDateId = null;
            String endDateId = null;
            String isCurrentId = null;

            List<UIComponent> listChild = uiForm.getChilds();

            companyId = listChild.get(blockIdx).getId();
            positionId = listChild.get(blockIdx + 1).getId();
            descriptionId = listChild.get(blockIdx + 2).getId();
            skillsId = listChild.get(blockIdx + 3).getId();
            startDateId = listChild.get(blockIdx + 4).getId();
            endDateId = listChild.get(blockIdx + 5).getId();
            isCurrentId = listChild.get(blockIdx + 6).getId();

            uiForm.removeChildById(companyId);
            uiForm.removeChildById(positionId);
            uiForm.removeChildById(descriptionId);
            uiForm.removeChildById(skillsId);
            uiForm.removeChildById(startDateId);
            uiForm.removeChildById(endDateId);
            uiForm.removeChildById(isCurrentId);

            event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
            Utils.resizeHomePage();
        }
    }

    /**
     * Saves experience informations to profile.<br>
     */
    public static class SaveActionListener extends UIProfileSection.SaveActionListener {

        @Override
        public void execute(Event<UIProfileSection> event) throws Exception {
            UIProfileSection sect = event.getSource();
            UIExperienceSection uiExperienceSectionSect = (UIExperienceSection) sect;
            if (uiExperienceSectionSect.saveProfileInfo() == 0) {
                super.execute(event);
            }
        }
    }

    /**
     * Changes to edit mode when Edit button is clicked.<br>
     */
    public static class EditActionListener extends UIProfileSection.EditActionListener {

        @Override
        @SuppressWarnings("unchecked")
        public void execute(Event<UIProfileSection> event) throws Exception {
            UIProfileSection sect = event.getSource();
            UIExperienceSection uiExpSection = (UIExperienceSection) sect;
            ArrayList<HashMap<String, Object>> experiences;
            Profile p = sect.getProfile();
            List<UIComponent> listChild = uiExpSection.getChilds();
            List<Object> listProfile = new ArrayList<Object>();
            int childSize = listChild.size() - 1; // List of children include UITitleBar child.
            String companyId = null;
            String positionId = null;
            String skillsId = null;
            String startDateId = null;
            String isCurrentId = null;
            String endDateId = null;
            String descriptionId = null;

            experiences = (ArrayList<HashMap<String, Object>>) p.getProperty(Profile.EXPERIENCES);
            if (experiences == null) {
                for (int idx = 1; idx <= childSize; idx += 7) {
                    sect.removeChild(UIFormStringInput.class);
                    sect.removeChild(UIFormStringInput.class);
                    sect.removeChild(UIFormTextAreaInput.class);
                    sect.removeChild(UIFormTextAreaInput.class);
                    sect.removeChild(UIFormDateTimeInput.class);
                    sect.removeChild(UIFormDateTimeInput.class);
                    sect.removeChild(UICheckBoxInput.class);
                }
            } else {
                for (HashMap<String, Object> map : experiences) {
                    listProfile.add(StringEscapeUtils.unescapeHtml((String) map.get(Profile.EXPERIENCES_COMPANY)));
                    listProfile.add(StringEscapeUtils.unescapeHtml((String) map.get(Profile.EXPERIENCES_POSITION)));
                    listProfile
                            .add(StringEscapeUtils.unescapeHtml((String) map.get(Profile.EXPERIENCES_DESCRIPTION)));
                    listProfile.add(StringEscapeUtils.unescapeHtml((String) map.get(Profile.EXPERIENCES_SKILLS)));
                    listProfile.add(map.get(Profile.EXPERIENCES_START_DATE));
                    listProfile.add(map.get(Profile.EXPERIENCES_END_DATE));
                    listProfile.add(map.get(Profile.EXPERIENCES_IS_CURRENT));
                }

                int totalProfiles = listProfile.size();
                int numberOfChildren = 0;
                if (totalProfiles > childSize) {
                    numberOfChildren = childSize;
                    while (totalProfiles > numberOfChildren) {
                        uiExpSection.addUIFormInput();
                        numberOfChildren += 7;
                    }
                } else if (totalProfiles < childSize) {
                    numberOfChildren = childSize;
                    while (totalProfiles < numberOfChildren) {
                        companyId = listChild.get(childSize - 6).getName();
                        positionId = listChild.get(childSize - 5).getName();
                        descriptionId = listChild.get(childSize - 4).getName();
                        skillsId = listChild.get(childSize - 3).getName();
                        startDateId = listChild.get(childSize - 2).getName();
                        endDateId = listChild.get(childSize - 1).getName();
                        isCurrentId = listChild.get(childSize).getName();

                        sect.removeChildById(companyId);
                        sect.removeChildById(positionId);
                        sect.removeChildById(descriptionId);
                        sect.removeChildById(skillsId);
                        sect.removeChildById(startDateId);
                        sect.removeChildById(endDateId);
                        sect.removeChildById(isCurrentId);

                        numberOfChildren -= 7;
                    }
                }

                List<UIComponent> listChildForSetValue = uiExpSection.getChilds();
                for (int idx = 0; idx < totalProfiles; idx += 7) {
                    ((UIFormInput) listChildForSetValue.get(idx + 1)).setValue(listProfile.get(idx));
                    ((UIFormInput) listChildForSetValue.get(idx + 2)).setValue(listProfile.get(idx + 1));
                    ((UIFormInput) listChildForSetValue.get(idx + 3)).setValue(listProfile.get(idx + 2)); // des
                    ((UIFormInput) listChildForSetValue.get(idx + 4)).setValue(listProfile.get(idx + 3)); // skills

                    if (listProfile.get(idx + 4) != null) {
                        // start date
                        ((UIFormDateTimeInput) listChildForSetValue.get(idx + 5))
                                .setCalendar(uiExpSection.stringToCalendar(listProfile.get(idx + 4).toString()));
                    }

                    if (listProfile.get(idx + 5) != null) {
                        // end date
                        ((UIFormDateTimeInput) listChildForSetValue.get(idx + 6))
                                .setCalendar(uiExpSection.stringToCalendar(listProfile.get(idx + 5).toString()));
                    } else {
                        // end date
                        ((UIFormInput) listChildForSetValue.get(idx + 6)).setValue(listProfile.get(idx + 5));
                    }

                    ((UICheckBoxInput) listChildForSetValue.get(idx + 7))
                            .setValue((Boolean) listProfile.get(idx + 6));
                    ((UIFormDateTimeInput) listChildForSetValue.get(idx + 6))
                            .setRendered(!((UICheckBoxInput) listChildForSetValue.get(idx + 7)).getValue());
                }
            }

            super.execute(event);
        }
    }

    /**
     * Shows and hides end date component depending on isCurrent variable.<br>
     */
    static public class ShowHideEndDateActionListener extends EventListener<UICheckBoxInput> {

        @Override
        public void execute(Event<UICheckBoxInput> event) throws Exception {
            UICheckBoxInput sect = event.getSource();
            UIExperienceSection uiForm = sect.getAncestorOfType(UIExperienceSection.class);
            UIFormDateTimeInput uiDateTime = uiForm.getChildById(Profile.EXPERIENCES_END_DATE + sect.getId());
            boolean isCheck = sect.isChecked();
            uiDateTime.setRendered(!isCheck);

            event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
            Utils.resizeHomePage();
        }
    }

    /**
     * Gets all the past experience.<br>
     *
     * @return all the experience that has isCurrent is false.
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public List<HashMap<String, Object>> getPastExperience() throws Exception {
        ArrayList<HashMap<String, Object>> experiences;
        ArrayList<HashMap<String, Object>> pastExperiences = new ArrayList<HashMap<String, Object>>();
        Profile p = getProfile();
        experiences = (ArrayList<HashMap<String, Object>>) p.getProperty(Profile.EXPERIENCES);
        if (experiences != null) {
            for (HashMap<String, Object> map : experiences) {
                if (!(Boolean) map.get(Profile.EXPERIENCES_IS_CURRENT)) {
                    pastExperiences.add(map);
                }
            }
        }

        return pastExperiences;
    }

    /**
     * Gets all the current experience.<br>
     *
     * @return all the experience that has isCurrent is true.
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public List<HashMap<String, Object>> getCurrentExperience() throws Exception {
        ArrayList<HashMap<String, Object>> experiences;
        ArrayList<HashMap<String, Object>> currentExperiences = new ArrayList<HashMap<String, Object>>();
        Profile p = getProfile();
        experiences = (ArrayList<HashMap<String, Object>>) p.getProperty(Profile.EXPERIENCES);
        if (experiences != null) {
            for (HashMap<String, Object> map : experiences) {
                if ((Boolean) map.get(Profile.EXPERIENCES_IS_CURRENT)) {
                    currentExperiences.add(map);
                }
            }
        }

        return currentExperiences;
    }

    /**
     * Saves input information into profile.<br>
     *
     * @return Integer value (0: save complete; 1,2: an error has occurs)
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    private int saveProfileInfo() throws Exception {
        ArrayList<HashMap<String, Object>> experiences = new ArrayList<HashMap<String, Object>>();
        UIFormStringInput uiStringInput = null;
        UIFormTextAreaInput uiFormTextAreaInput = null;
        UICheckBoxInput uiCheckBox = null;
        UIFormDateTimeInput uiDateTimeInput = null;
        String company = null;
        String position = null;
        String description = null;
        String skills = null;
        String startDate = null;
        String endDate = null;
        Boolean isCurrent = null;
        Date sDate = null;
        Date eDate = null;
        Date today = new Date();

        WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
        UIApplication uiApplication = context.getUIApplication();
        Profile p = getProfile();
        List<UIComponent> listUIComp = getChilds();
        int totalUIComponent = listUIComp.size() - 1; // List of children not include UITitleBar child.

        int errorCode = 0;
        if (totalUIComponent == 0) {
            if (p != null) {
                Profile updateProfile = new Profile(p.getIdentity());
                updateProfile.setId(p.getId());
                updateProfile.setProperty(Profile.EXPERIENCES, experiences);
                Utils.getIdentityManager().updateExperienceSection(updateProfile);
            }

            return errorCode;
        }

        for (int i = 1; i <= totalUIComponent; i += 7) {
            HashMap<String, Object> uiMap = new HashMap<String, Object>();

            uiStringInput = (UIFormStringInput) listUIComp.get(i);
            company = uiStringInput.getValue();

            if ((company == null) || (company.length() == 0)) {
                uiApplication.addMessage(new ApplicationMessage(INVALID_COMPANY_MANDATORY, null, 1));
                errorCode = 1;
            }

            uiStringInput = (UIFormStringInput) listUIComp.get(i + 1);
            position = uiStringInput.getValue();

            if ((position == null) || (position.length() == 0)) {
                uiApplication.addMessage(new ApplicationMessage(INVALID_POSITION_MANDATORY, null, 1));
                errorCode = 1;
            }

            uiFormTextAreaInput = (UIFormTextAreaInput) listUIComp.get(i + 2);
            description = uiFormTextAreaInput.getValue();

            uiFormTextAreaInput = (UIFormTextAreaInput) listUIComp.get(i + 3);
            skills = uiFormTextAreaInput.getValue();

            uiDateTimeInput = (UIFormDateTimeInput) listUIComp.get(i + 4);
            Locale locale = context.getParentAppRequestContext().getLocale();
            String currentPartern = uiDateTimeInput.getDatePattern_();

            SimpleDateFormat sf = new SimpleDateFormat(currentPartern, locale);
            Calendar cal = Calendar.getInstance();

            if (!"".equals(uiDateTimeInput.getValue())) {
                cal.setTime(sf.parse(uiDateTimeInput.getValue()));
                startDate = calendarToString(cal);
                if ((startDate == null) || (startDate.length() == 0)) {
                    uiApplication.addMessage(new ApplicationMessage(INVALID_START_DATE_MANDATORY, null, 1));
                    errorCode = 1;
                }
            }

            try {
                uiDateTimeInput = (UIFormDateTimeInput) listUIComp.get(i + 5);
                if (!"".equals(uiDateTimeInput.getValue())) {
                    cal.setTime(sf.parse(uiDateTimeInput.getValue()));
                }
            } catch (Exception e) {
                endDate = null;
            }

            uiCheckBox = (UICheckBoxInput) listUIComp.get(i + 6);
            isCurrent = uiCheckBox.getValue();

            if (startDate == null && (endDate != null || isCurrent.booleanValue())
                    || "".equals(startDate) && ("".equals(endDate) || isCurrent.booleanValue())) {
                uiApplication.addMessage(new ApplicationMessage(INVALID_START_DATE_MANDATORY, null, 1));
                errorCode = 1;
            }

            if (startDate != null && !"".equals(startDate)) {
                endDate = calendarToString(cal);

                sDate = stringToDate(startDate);
                eDate = stringToDate(endDate);
                if (endDate != null && !"".equals(endDate) && sDate.after(today)) {
                    uiApplication.addMessage(new ApplicationMessage(START_DATE_AFTER_TODAY, null, 1));
                    errorCode = 1;
                }

                if (!isCurrent) {
                    if ((endDate == null) || (endDate.length() == 0)) {
                        uiApplication.addMessage(new ApplicationMessage(INVALID_END_DATE_MANDATORY, null, 1));
                        errorCode = 1;
                    }

                    if ((eDate != null) && eDate.after(today)) {
                        uiApplication.addMessage(new ApplicationMessage(END_DATE_AFTER_TODAY, null, 1));
                        errorCode = 1;
                    }
                    if ((sDate != null) && sDate.after(eDate)) {
                        uiApplication.addMessage(new ApplicationMessage(STARTDATE_BEFORE_ENDDATE, null, 1));
                        errorCode = 1;
                    }
                } else {
                    endDate = null;
                }
            }

            uiMap.put(Profile.EXPERIENCES_COMPANY, escapeHtml(company));
            uiMap.put(Profile.EXPERIENCES_POSITION, escapeHtml(position));
            uiMap.put(Profile.EXPERIENCES_DESCRIPTION, escapeHtml(description));
            uiMap.put(Profile.EXPERIENCES_SKILLS, escapeHtml(skills));

            uiMap.put(Profile.EXPERIENCES_START_DATE, startDate);
            uiMap.put(Profile.EXPERIENCES_END_DATE, endDate);
            uiMap.put(Profile.EXPERIENCES_IS_CURRENT, isCurrent);

            experiences.add(uiMap);
        }

        if (errorCode == 1) {
            return errorCode;
        }

        p.setProperty(Profile.EXPERIENCES, experiences);
        Utils.getIdentityManager().updateProfile(p);

        return errorCode;
    }

    /**
     * Adds component when add buttons clicked.<br>
     *
     * @throws Exception
     */
    private void addUIFormInput() throws Exception {
        WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
        ResourceBundle resourceBundle = requestContext.getApplicationResourceBundle();
        expIdx += 1;
        addUIFormInput(new UIFormStringInput(Profile.EXPERIENCES_COMPANY + expIdx, null, null)
                .addValidator(PersonalNameValidator.class));
        addUIFormInput(new UIFormStringInput(Profile.EXPERIENCES_POSITION + expIdx, null, null)
                .addValidator(PersonalNameValidator.class));

        UIFormTextAreaInput description = new UIFormTextAreaInput(Profile.EXPERIENCES_DESCRIPTION + expIdx, null,
                null);
        description.setHTMLAttribute(HTML_ATTRIBUTE_TITLE,
                resourceBundle.getString("UIExperienceSection.label.description"));
        addUIFormInput(description);
        UIFormTextAreaInput uiDespcription = getChildById(Profile.EXPERIENCES_DESCRIPTION + expIdx);
        uiDespcription.setColumns(28);
        uiDespcription.setRows(3);

        UIFormTextAreaInput skills = new UIFormTextAreaInput(Profile.EXPERIENCES_SKILLS + expIdx, null, null);
        skills.setHTMLAttribute(HTML_ATTRIBUTE_TITLE, resourceBundle.getString("UIExperienceSection.label.skills"));
        addUIFormInput(skills);
        UIFormTextAreaInput uiFormTextAreaInput = getChildById(Profile.EXPERIENCES_SKILLS + expIdx);
        uiFormTextAreaInput.setColumns(28);
        uiFormTextAreaInput.setRows(3);

        UIFormDateTimeInput startDate = new UIFormDateTimeInput(Profile.EXPERIENCES_START_DATE + expIdx, null, null,
                false);
        startDate.setHTMLAttribute(HTML_ATTRIBUTE_TITLE,
                resourceBundle.getString("UIExperienceSection.label.startDate"));
        addUIFormInput(
                startDate.addValidator(ExpressionValidator.class, DATETIME_REGEX, INVALID_START_DATE_FORMAT));

        UIFormDateTimeInput endDate = new UIFormDateTimeInput(Profile.EXPERIENCES_END_DATE + expIdx, null, null,
                false);
        endDate.setHTMLAttribute(HTML_ATTRIBUTE_TITLE,
                resourceBundle.getString("UIExperienceSection.label.endDate"));
        addUIFormInput(endDate.addValidator(ExpressionValidator.class, DATETIME_REGEX, INVALID_END_DATE_FORMAT));

        UICheckBoxInput uiDateInputCheck = new UICheckBoxInput(Integer.toString(expIdx), null, false);
        uiDateInputCheck.setComponentConfig(UICheckBoxInput.class, "UIFormCheckBoxEndDate");
        uiDateInputCheck.setOnChange("ShowHideEndDate", uiDateInputCheck.getId());
        addUIFormInput(uiDateInputCheck);

        //    addUIFormInput(new UIFormStringInput(DESCRIPTION + expIdx, null, null));
    }

    /**
     * Formats String type to Date type.<br>
     *
     * @param dateStr Input String
     * @return Converted date.
     * @throws ParseException
     */
    private Date stringToDate(String dateStr) throws ParseException {
        SimpleDateFormat formatDate = new SimpleDateFormat(DATE_FORMAT_MMDDYYYY, Locale.ENGLISH);
        if ((dateStr == null) || (dateStr.trim().length() == 0)) {
            return null;
        }
        return formatDate.parse(dateStr);
    }

    /**
     * Gets calendar with string date input.<br>
     *
     * @param inDate Date input.
     * @return calendar.
     * @throws ParseException
     */
    private Calendar getCalendar(String inDate) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT_MMDDYYYY, Locale.ENGLISH);
        Date date = format.parse(inDate);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }
}