de.knurt.fam.template.controller.json.UpdateUserFromContactDetailsController.java Source code

Java tutorial

Introduction

Here is the source code for de.knurt.fam.template.controller.json.UpdateUserFromContactDetailsController.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.controller.json;

import java.io.IOException;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.validator.EmailValidator;
import org.json.JSONException;
import org.json.JSONObject;

import de.knurt.fam.core.aspects.logging.FamLog;
import de.knurt.fam.core.aspects.security.auth.SessionAuth;
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.util.UserFactory;
import de.knurt.fam.core.util.mvc.RequestInterpreter;
import de.knurt.fam.template.util.ContactDetailsRequestHandler;
import de.knurt.heinzelmann.ui.html.HtmlElement;
import de.knurt.heinzelmann.util.query.Identificable;

/**
 * controller for ajax request to change a contact detail. answer with: a status
 * id for
 * <ul>
 * <li><code>OK</code>: input saved</li>
 * <li><code>BAD_REQUEST</code>: if basic parameters are missed</li>
 * <li><code>WRONG_INPUTS</code>: if user set something wrong, mostly an empty
 * input, but may also be a wrong date or email format</li>
 * </ul>
 * only if status is <code>OK</code>, answer with:
 * <ul>
 * <li><code>summaryTable</code></li>: the complete new table with details
 * <li><code>fullName</code></li>: the new name of the user (if first or last
 * name changed)
 * <li><code>updatedId</code></li>: if there was added a new contact detail,
 * there must be an input for that to edit shown then.
 * </ul>
 * 
 * @link contactdetails.js
 * @see ContactDetailsController
 * @author Daniel Oltmanns
 * @since 0.20100130 (01/30/2010)
 */
public class UpdateUserFromContactDetailsController extends JSONController {
    private boolean customFieldUpdated = false;

    /**
     * return an available possible booking.
     * 
     * there are two different places where this is called: 1. the
     * "request booking" link in the navigation of the calendar 2. the drag and
     * drop action in same calender
     * 
     * the response depends on which place causes the request.
     * 
     * @param rq
     *            request
     * @param rs
     *            response
     * @return an available possible booking.
     */
    @Override
    public JSONObject getJSONObject(HttpServletRequest rq, HttpServletResponse rs) {
        JSONObject result = new JSONObject();
        try {
            if (ContactDetailsRequestHandler.isValidUpdateRequest(rq)) {
                Identificable objectChanged = this.updateValue(rq);
                int status = objectChanged == null ? BAD_REQUEST
                        : (objectChanged.getClass().equals(WrongInput.class) ? WRONG_INPUTS : OK);
                result.put("succ", status);
                if (status == OK) {
                    // assert objectChanged is a user!!!
                    result.put("summaryTable", this.getSummaryTable(rq));
                    User user = ContactDetailsRequestHandler.getUserOfRequest(rq);
                    result.put("fullName", user.getFullName());
                    result.put("updatedId", objectChanged.getId());
                    result.put("showCompleteMessage", !user.hasUnsufficientContactDetails());
                    result.put("customFieldUpdated", this.customFieldUpdated);
                }
            } else {
                result.put("succ", "0");
            }
        } catch (JSONException ex) {
            this.onException(ex);
        }
        return result;
    }

    /** {@inheritDoc} */
    @Override
    public void onException(IOException ex) {
        FamLog.exception(ex, 201205071225l);
    }

    private void onException(Exception ex) {
        FamLog.exception("creating json failed", ex, 201001301336l);
    }

    private static final int OK = 1;
    private static final int BAD_REQUEST = 3;
    private static final int WRONG_INPUTS = 2;

    private Identificable updateValue(HttpServletRequest rq) {
        Identificable result = null;
        this.customFieldUpdated = false;
        User user = ContactDetailsRequestHandler.getUserOfRequest(rq);
        String of = RequestInterpreter.getOf(rq);
        if (of != null) {
            if (of.equals("company")) {
                user.setCompany(ContactDetailsRequestHandler.getValue(rq, "company"));
                user.update();
                result = user;
            } else if (of.equals("phone1")) {
                user.setPhone1(ContactDetailsRequestHandler.getValue(rq, "phone1"));
                user.update();
                result = user;
            } else if (of.equals("fname")) {
                user.setFname(ContactDetailsRequestHandler.getValue(rq, "fname"));
                user.update();
                result = user;
            } else if (of.equals("intendedResearch")) {
                user.setIntendedResearch(ContactDetailsRequestHandler.getValue(rq, "intendedResearch"));
                user.update();
                result = user;
            } else if (of.equals("sname")) {
                user.setSname(ContactDetailsRequestHandler.getValue(rq, "sname"));
                user.update();
                result = user;
            } else if (of.equals("title")) {
                user.setTitle(ContactDetailsRequestHandler.getValue(rq, "title"));
                user.update();
                result = user;
            } else if (of.equals("mail")) {
                String newMail = ContactDetailsRequestHandler.getValue(rq, "mail");
                User example = UserFactory.me().blank();
                example.setMail(newMail);
                if (EmailValidator.getInstance().isValid(newMail)
                        && !FamDaoProxy.userDao().userLikeExists(example)) {
                    user.setMail(newMail);
                    user.update();
                    result = user;
                }
            } else if (of.equals("departmentLabel") || of.equals("departmentKey")) {
                String departmentKey = ContactDetailsRequestHandler.getValue(rq, "departmentKey");
                String departmentLabel = ContactDetailsRequestHandler.getValue(rq, "departmentLabel");
                departmentLabel = ContactDetailsRequestHandler.getDepartmentLabel(departmentLabel, departmentKey);
                user.setDepartmentLabel(departmentLabel);
                user.setDepartmentKey(departmentKey);
                user.update();
                result = user;
            } else if (of.equals("birthdate")) {
                Date birthdate = ContactDetailsRequestHandler
                        .getDate(ContactDetailsRequestHandler.getValue(rq, "birthdate"));
                user.setBirthdate(birthdate);
                user.update();
                result = user;
            } else if (of.equals("male")) {
                String male = ContactDetailsRequestHandler.getValue(rq, "male");
                if (male != null) {
                    user.setMale(male.equals("1") ? true : false);
                } else {
                    user.setMale(null);
                }
                user.update();
                result = user;
            } else if (of.equals("phone2")) {
                user.setPhone2(ContactDetailsRequestHandler.getValue(rq, "phone2"));
                user.update();
                result = user;
            } else if (of.equals("address")) {

                Address changeaddress = user.getMainAddress();
                if (changeaddress == null) {
                    changeaddress = new Address();
                }
                changeaddress.setStreet(ContactDetailsRequestHandler.getValue(rq, "street"));
                changeaddress.setStreetno(ContactDetailsRequestHandler.getValue(rq, "streetno"));
                changeaddress.setZipcode(ContactDetailsRequestHandler.getValue(rq, "zipcode"));
                changeaddress.setCity(ContactDetailsRequestHandler.getValue(rq, "city"));
                changeaddress.setCountry(ContactDetailsRequestHandler.getValue(rq, "country"));
                user.setMainAddress(changeaddress);
                user.update();
                result = user;
            } else if (of.startsWith("cd_")) {
                if (of.equals("cd_new")) {
                    String newTitle = ContactDetailsRequestHandler.getValue(rq, "title_new");
                    String newDetail = ContactDetailsRequestHandler.getValue(rq, "detail_new");

                    // change unspecific contact details
                    if (newTitle != null && newDetail != null) {
                        newTitle = newTitle.trim();
                        newDetail = newDetail.trim();
                        if (!newTitle.isEmpty() && !newDetail.isEmpty()) {
                            ContactDetail cd = new ContactDetail();
                            cd.setDetail(newDetail);
                            cd.setTitle(newTitle);
                            cd.setUsername(user.getUsername());
                            cd.insert();
                            result = cd;
                        } else {
                            result = new WrongInput();
                        }
                    } else {
                        result = new WrongInput();
                    }
                } else {
                    try {
                        Integer cdId = Integer.parseInt(of.substring(3));
                        String newTitle = ContactDetailsRequestHandler.getValue(rq, "title_" + cdId);
                        String newDetail = ContactDetailsRequestHandler.getValue(rq, "detail_" + cdId);
                        if (newTitle != null && newDetail != null) {
                            for (ContactDetail cdExist : user.getContactDetails()) {
                                if (cdExist.getId().intValue() == cdId) {
                                    cdExist.setDetail(newDetail);
                                    cdExist.setTitle(newTitle);
                                    cdExist.update();
                                    result = cdExist;
                                    break;
                                }
                            }
                        }
                        if (result == null) {
                            result = new WrongInput();
                        }
                    } catch (NumberFormatException e) {
                    }
                }
            } else {
                // save as custom detail
                user.addCustomField(of, rq.getParameter(of));
                user.update();
                this.customFieldUpdated = true;
                result = user;
            }
            if (SessionAuth.authUser(rq) && SessionAuth.user(rq).getUsername().equals(user.getUsername())) {
                SessionAuth.getInstance(rq).setUser(user);
            }
        }
        return result;
    }

    @SuppressWarnings("deprecation") // TODO #11 kill uses of deprecations
    private HtmlElement getSummaryTable(HttpServletRequest rq) {
        User user = ContactDetailsRequestHandler.getUserOfRequest(rq);
        return ContactDetailsRequestHandler.getSummaryTable(user);
    }
}

final class WrongInput implements Identificable {

    @Override
    public Integer getId() {
        return -1;
    }

    @Override
    public void setId(Integer id) {
    }
}