de.knurt.fam.template.util.ContactDetailsRequestHandler.java Source code

Java tutorial

Introduction

Here is the source code for de.knurt.fam.template.util.ContactDetailsRequestHandler.java

Source

/*
 * Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de)
 *
 * Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://creativecommons.org/licenses/by-nc-sa/3.0/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.knurt.fam.template.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.validator.EmailValidator;

import de.knurt.fam.core.aspects.logging.FamLog;
import de.knurt.fam.core.aspects.security.auth.SessionAuth;
import de.knurt.fam.core.model.config.Department;
import de.knurt.fam.core.model.persist.Address;
import de.knurt.fam.core.model.persist.ContactDetail;
import de.knurt.fam.core.model.persist.User;
import de.knurt.fam.core.persistence.dao.FamDaoProxy;
import de.knurt.fam.core.persistence.dao.config.KnownDepartmentConfigDao;
import de.knurt.fam.core.util.UserFactory;
import de.knurt.fam.core.util.mvc.QueryKeys;
import de.knurt.fam.core.util.mvc.QueryStringBuilder;
import de.knurt.fam.core.util.mvc.RequestInterpreter;
import de.knurt.fam.core.util.mvc.validator.InvalidRoleIdException;
import de.knurt.fam.core.util.mvc.validator.MandatoryUserFieldValidator;
import de.knurt.fam.core.view.html.factory.FamFormFactory;
import de.knurt.fam.core.view.html.factory.FamSubmitButtonFactory;
import de.knurt.fam.core.view.text.FamDateFormat;
import de.knurt.heinzelmann.ui.html.HtmlElement;
import de.knurt.heinzelmann.ui.html.HtmlFactory;
import de.knurt.heinzelmann.util.query.QueryString;

/**
 * like {@link RequestInterpreter} this interprets requests, but especially
 * for the contact detail page.
 * 
 * @author Daniel Oltmanns
 * @since 0.20100130 (01/30/2009)
 */
public class ContactDetailsRequestHandler {

    /**
     * return the user that is in the request or null, if no user found.
     * 
     * @param rq
     *            request got
     * @return the user that is in the request or null, if no user found.
     */
    public static User getUserOfRequest(HttpServletRequest rq) {
        User result = null;
        Integer user_id = null;
        try {
            user_id = Integer.parseInt(rq.getParameter("user_id"));
        } catch (NumberFormatException e) {
        }
        if (user_id != null) {
            User example = UserFactory.getInstance().blank();
            example.setId(user_id);
            result = FamDaoProxy.userDao().getOneLike(example);
        }
        return result;
    }

    /**
     * return the value with given key in given request, if it is set and not
     * empty.
     * 
     * @param rq
     *            request got
     * @param key
     *            interested in
     * @return the value with given key in given request, if it is set and not
     *         empty.
     */
    public static String getValue(HttpServletRequest rq, String key) {
        String result = rq.getParameter(key) == null ? null : rq.getParameter(key).trim();
        return result == null || result.isEmpty() ? null : result;
    }

    /**
     * return true, if the request is valid. the request is valid, if the user
     * wants to change its own contact details or if the user is an
     * administrator. invalid request is missing param that must be there or
     * modify another user without to have the right to OR modify another user
     * without to have the right to.
     * 
     * @param rq
     *            request got
     * @return true, if the request is valid.
     */
    public static boolean isValidUpdateRequest(HttpServletRequest rq) {
        boolean result = userHasRightToViewAndModifyContactDetails(rq);
        if (result) {
            result = getUserOfRequest(rq) != null;
        }
        if (result) {
            String newMail = ContactDetailsRequestHandler.getValue(rq, "mail");
            if (newMail != null && !EmailValidator.getInstance().isValid(newMail)) {
                result = false;
            }

        }
        return result;
    }

    @Deprecated
    public static HtmlElement getSummaryTable(User user) {

        HtmlElement tbody = HtmlFactory.get("tbody");
        String tmp = "";

        // fname
        tmp = "";
        if (user.getFname() != null && !user.getFname().isEmpty()) {
            tmp = user.getFname();
        }
        buildSummaryRow(user, tbody, "First name", tmp, "fname"); // INTLANG

        // sname
        tmp = "";
        if (user.getSname() != null && !user.getSname().isEmpty()) {
            tmp = user.getSname();
        }
        buildSummaryRow(user, tbody, "Last Name", tmp, "sname"); // INTLANG

        // address table
        Address address = user.getMainAddress();
        if (address != null) {
            String tmpTmp = new HtmlAdapterAddress(address).getFullAsText("<br />");
            if (!tmpTmp.isEmpty()) {
                tmp = tmpTmp;
            }
        }
        buildSummaryRow(user, tbody, "Address", tmp, "address"); // INTLANG

        // email
        tmp = user.getMail();
        buildSummaryRow(user, tbody, "E-Mail", tmp, "mail"); // INTLANG

        // title
        tmp = "";
        if (user.getTitle() != null && !user.getTitle().isEmpty()) {
            tmp = user.getTitle();
        }
        buildSummaryRow(user, tbody, "Title", tmp, "title"); // INTLANG

        // gender
        tmp = "";
        if (user.getMale() != null) {
            tmp = user.getMale() ? "Male" : "Female"; // INTLANG
        }
        buildSummaryRow(user, tbody, "Gender", tmp, "male"); // INTLANG

        // birthdate
        tmp = "";
        if (user.getBirthdate() != null) {
            tmp = FamDateFormat.getDateFormatted(user.getBirthdate());
        }
        buildSummaryRow(user, tbody, "Day of birth", tmp, "birthdate"); // INTLANG

        // company
        tmp = "";
        if (user.getCompany() != null && !user.getCompany().isEmpty()) {
            tmp = user.getCompany();
        }
        buildSummaryRow(user, tbody, "Institution", tmp, "company"); // INTLANG

        // department
        tmp = "";
        if (user.getDepartmentLabel() != null && !user.getDepartmentLabel().isEmpty()) {
            tmp = user.getDepartmentLabel();
        }
        buildSummaryRow(user, tbody, "Department", tmp, "departmentLabel"); // INTLANG

        // landline
        tmp = "";
        if (user.getPhone1() != null && !user.getPhone1().isEmpty()) {
            tmp = user.getPhone1();
        }
        buildSummaryRow(user, tbody, "Landline", tmp, "phone1"); // INTLANG

        // mobile
        tmp = "";
        if (user.getPhone2() != null && !user.getPhone2().isEmpty()) {
            tmp = user.getPhone2();
        }
        buildSummaryRow(user, tbody, "Mobile", tmp, "phone2"); // INTLANG

        // free contact details
        for (ContactDetail cd : user.getContactDetails()) {
            buildSummaryRow(user, tbody, cd.getTitle(), cd.getDetail(), "cd_" + cd.getId());
        }

        // intendedResearch
        tmp = "";
        if (user.getIntendedResearch() != null && !user.getIntendedResearch().isEmpty()) {
            tmp = user.getIntendedResearch().replaceAll(System.getProperty("line.separator"), "<br />");
        }
        buildSummaryRow(user, tbody, "Intended Research Projekt", tmp, "intendedResearch"); // INTLANG

        return tbody;
    }

    private static void buildSummaryRow(User user, HtmlElement table, String label, String value,
            String actionName) {
        if (value.isEmpty()) {
            HtmlElement shownValue = new HtmlElement("span");
            try {
                if (MandatoryUserFieldValidator.getInstance().isSufficient(user, actionName)) {
                    shownValue.add("unknown"); // INTLANG
                } else {
                    shownValue.addClassName("missed").add("please add"); // INTLANG
                }
            } catch (InvalidRoleIdException e) {
                FamLog.exception(e, 201011151041l);
                shownValue.add("error 201011151041");
            }
            table.add(HtmlFactory.getInstance().get_tr(label, shownValue)
                    .add(getActionTd(actionName, 1, user, false)));
        } else { // user has address
            HtmlElement shownValue = new HtmlElement("p").add(value);
            try {
                if (!MandatoryUserFieldValidator.getInstance().isSufficient(user, actionName)) {
                    shownValue.add(new HtmlElement("br"))
                            .add(new HtmlElement("span").addClassName("missed").add("please complete")); // INTLANG
                }
            } catch (InvalidRoleIdException e) {
                FamLog.exception(e, 201011151042l);
                shownValue.add("error 201011151042");
            }
            table.add(HtmlFactory.get("tr").add(HtmlFactory.get("td").add(label))
                    .add(HtmlFactory.get("td").add(shownValue)).add(getActionTd(actionName, 1, user, true)));
        }
    }

    private static HtmlElement getActionTd(String queryKeyOf, int rowcount, User user, boolean forExisting) {
        HtmlElement result = HtmlFactory.get("td");
        // build delete form
        if (forExisting && !queryKeyOf.equals("mail")) {
            QueryString deleteQueryString = QueryStringBuilder.getDeleteQueryString();
            deleteQueryString.put(QueryKeys.QUERY_KEY_OF, queryKeyOf);
            deleteQueryString.put("hasBeenSent", "true");
            deleteQueryString.put("user_id", user.getId());
            HtmlElement deleteButton = FamSubmitButtonFactory.getDeleteButton();
            HtmlElement deleteForm = FamFormFactory.getForm(deleteQueryString, deleteButton);
            deleteForm.setAttribute("action", TemplateHtml.href("contactdetails"));
            result.add(deleteForm);
        }

        // build edit button (only for javascript version)
        QueryString editQueryString = QueryStringBuilder.getDeleteQueryString();
        editQueryString.put(QueryKeys.QUERY_KEY_OF, queryKeyOf);
        editQueryString.put("hasBeenSent", "true");
        editQueryString.put("user_id", user.getId());
        HtmlElement editButton = null;
        if (forExisting || queryKeyOf.equals("mail")) {
            editButton = FamSubmitButtonFactory.getEditButton();
        } else {
            editButton = FamSubmitButtonFactory.getAddButton();
        }
        editButton.addClassName("js_edit");
        HtmlElement editForm = FamFormFactory.getForm(editQueryString, editButton);
        editForm.setAttribute("action", TemplateHtml.href("contactdetails"));
        editForm.setAttribute("onSubmit", "javascript: return false;");
        editForm.doNotDisplay();
        editForm.addClassName("js_show");
        result.add(editForm);

        // build result td
        result.setAttribute("rowspan", rowcount);
        result.addClassName("action");
        return result;
    }

    /**
     * return the date from a date input. input must have format ddMMyyyy (or
     * dd.MM.yyyy etc.).
     * 
     * @param birthdate
     *            as put in
     * @return the date from a date input
     */
    public static Date getDate(String birthdate) {
        Date result = null;
        if (birthdate != null) {
            String input = birthdate.trim().replaceAll("[^0-9]", "");
            try {
                DateFormat df = new SimpleDateFormat("ddMMyyyy");
                df.setLenient(false);
                result = df.parse(input);
            } catch (ParseException ex) {
            }
        }
        return result;

    }

    private ContactDetailsRequestHandler() {
    }

    public static String getDepartmentLabel(String departmentLabel, String departmentKey) {
        Department d = null;
        if (departmentLabel == null || departmentLabel.trim().isEmpty()) {
            d = KnownDepartmentConfigDao.getInstance().get(departmentKey);
        }
        if (d != null) {
            return d.getTitle();
        } else {
            return departmentLabel;
        }
    }

    public static boolean userHasRightToViewAndModifyContactDetails(HttpServletRequest rq) {
        User changeuser = getUserOfRequest(rq);
        if (changeuser != null) {
            User authuser = SessionAuth.user(rq);
            return changeuser.getUsername().equals(authuser.getUsername()) || authuser.isAdmin();
        } else {
            return true;
        }
    }

    public static Date correctBirthdate(Date birthdate) {
        Calendar now = Calendar.getInstance();
        // older then 0?
        if (birthdate != null) {
            if (birthdate.after(now.getTime())) {
                birthdate = null;
            }
        }
        if (birthdate != null) {
            // younger then 200?
            now.roll(Calendar.YEAR, -200);
            if (birthdate.before(now.getTime())) {
                birthdate = null;
            }
        }
        return birthdate;
    }

    public static Date correctBirthdate(String birthdate) {
        return correctBirthdate(getDate(birthdate));
    }
}