org.projectforge.web.address.PhoneCallPage.java Source code

Java tutorial

Introduction

Here is the source code for org.projectforge.web.address.PhoneCallPage.java

Source

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2013 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition 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.projectforge.web.address;

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

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.address.AddressDO;
import org.projectforge.address.AddressDao;
import org.projectforge.common.NumberHelper;
import org.projectforge.common.StringHelper;
import org.projectforge.core.ConfigXml;
import org.projectforge.core.Configuration;
import org.projectforge.core.ConfigurationParam;
import org.projectforge.web.calendar.DateTimeFormatter;
import org.projectforge.web.wicket.AbstractStandardFormPage;

public class PhoneCallPage extends AbstractStandardFormPage {
    private static final long serialVersionUID = -5040319693295350276L;

    public final static String PARAMETER_KEY_ADDRESS_ID = "addressId";

    public final static String PARAMETER_KEY_NUMBER = "number";

    protected static final String[] BOOKMARKABLE_SELECT_PROPERTIES = new String[] {
            PARAMETER_KEY_ADDRESS_ID + "|address", PARAMETER_KEY_NUMBER + "|no" };

    private static final String SEPARATOR = " | ";

    private static final String USER_PREF_KEY_MY_RECENT_PHONE_ID = "PhoneCall:recentPhoneId";

    private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(PhoneCallPage.class);

    @SpringBean(name = "addressDao")
    private AddressDao addressDao;

    private final PhoneCallForm form;

    String result;

    public PhoneCallPage(final PageParameters parameters) {
        super(parameters);
        form = new PhoneCallForm(this);
        body.add(form);
        evaluateInitialPageParameters(getPageParameters());
        form.init();
    }

    public Integer getAddressId() {
        return form.address != null ? form.address.getId() : null;
    }

    public void setAddressId(final Integer addressId) {
        if (addressId != null) {
            final AddressDO address = addressDao.getById(addressId);
            form.address = address;
        }
    }

    public String getNumber() {
        return form.phoneNumber;
    }

    public void setNumber(final String number) {
        if (StringUtils.isNotBlank(number) == true) {
            form.setPhoneNumber(extractPhonenumber(number));
        }
    }

    /**
     * Find a phone number, search order is business, mobile, private mobile and private.
     * @return Number if found, otherwise empty string.
     */
    protected String getFirstPhoneNumber() {
        if (form.address == null) {
            return "";
        }
        if (StringUtils.isNotEmpty(form.address.getBusinessPhone()) == true) {
            return form.address.getBusinessPhone();
        } else if (StringUtils.isNotEmpty(form.address.getMobilePhone()) == true) {
            return form.address.getMobilePhone();
        } else if (StringUtils.isNotEmpty(form.address.getPrivateMobilePhone()) == true) {
            return form.address.getPrivateMobilePhone();
        } else if (StringUtils.isNotEmpty(form.address.getPrivatePhone()) == true) {
            return form.address.getPrivatePhone();
        }
        return "";
    }

    /**
     * For special phone numbers: id:# or # | name.
     * @return true, if the phone number was successfully processed.
     */
    private boolean processPhoneNumber() {
        final String phoneNumber = form.getPhoneNumber();
        if (StringUtils.isNotEmpty(phoneNumber) == true) {
            if (phoneNumber.startsWith("id:") == true && phoneNumber.length() > 3) {
                final Integer id = NumberHelper.parseInteger(phoneNumber.substring(3));
                if (id != null) {
                    form.setPhoneNumber("");
                    final AddressDO address = addressDao.getById(id);
                    if (address != null) {
                        form.setAddress(address);
                        final String no = getFirstPhoneNumber();
                        if (StringUtils.isNotEmpty(no) == true) {
                            setPhoneNumber(no, true);
                        }
                    }
                }
                return true;
            } else if (phoneNumber.indexOf(SEPARATOR) >= 0) {
                final int pos = phoneNumber.indexOf(SEPARATOR);
                final String rest = phoneNumber.substring(pos + SEPARATOR.length());
                final int numberPos = rest.indexOf('#');
                form.setPhoneNumber(phoneNumber.substring(0, pos));
                if (numberPos > 0) {
                    final Integer id = NumberHelper.parseInteger(rest.substring(numberPos + 1));
                    if (id != null) {
                        final AddressDO address = addressDao.getById(id);
                        if (address != null) {
                            form.setAddress(address);
                        }
                    } else {
                        form.setAddress(null);
                    }
                } else {
                    form.setAddress(null);
                }
                return true;
            }
        }
        return false;
    }

    public void setPhoneNumber(String phoneNumber, final boolean extract) {
        if (extract == true) {
            phoneNumber = extractPhonenumber(phoneNumber);
        }
        form.setPhoneNumber(phoneNumber);
    }

    String extractPhonenumber(final String number) {
        final String result = NumberHelper.extractPhonenumber(number,
                Configuration.getInstance().getStringValue(ConfigurationParam.DEFAULT_COUNTRY_PHONE_PREFIX));
        if (StringUtils.isNotEmpty(result) == true
                && StringUtils.isNotEmpty(ConfigXml.getInstance().getTelephoneSystemNumber()) == true
                && result.startsWith(ConfigXml.getInstance().getTelephoneSystemNumber()) == true) {
            return result.substring(ConfigXml.getInstance().getTelephoneSystemNumber().length());
        }
        return result;
    }

    @Override
    protected void onBeforeRender() {
        super.onBeforeRender();
        final String rawInput = form.numberTextField.getRawInput();
        if (StringUtils.isNotEmpty(rawInput) == true) {
            form.setPhoneNumber(rawInput);
        }
        processPhoneNumber();
        form.numberTextField.modelChanged();
    }

    void call() {
        final boolean extracted = processPhoneNumber();
        if (extracted == true) {
            return;
        }
        if (StringUtils.containsOnly(form.getPhoneNumber(), "0123456789+-/() ") == false) {
            form.addError("address.phoneCall.number.invalid");
            return;
        }
        form.setPhoneNumber(extractPhonenumber(form.getPhoneNumber()));
        callNow();
    }

    private void callNow() {
        if (StringUtils.isBlank(ConfigXml.getInstance().getTelephoneSystemUrl()) == true) {
            log.error("Telephone system url not configured. Phone calls not supported.");
            return;
        }
        log.info("User initiates direct call from phone with id '" + form.getMyCurrentPhoneId()
                + "' to destination numer: " + StringHelper.hideStringEnding(form.getPhoneNumber(), 'x', 3));
        result = null;
        final StringBuffer buf = new StringBuffer();
        buf.append(form.getPhoneNumber()).append(SEPARATOR);
        final AddressDO address = form.getAddress();
        if (address != null
                && StringHelper.isIn(form.getPhoneNumber(), extractPhonenumber(address.getBusinessPhone()),
                        extractPhonenumber(address.getMobilePhone()), extractPhonenumber(address.getPrivatePhone()),
                        extractPhonenumber(address.getPrivateMobilePhone())) == true) {
            buf.append(address.getFirstName()).append(" ").append(address.getName());
            if (form.getPhoneNumber().equals(extractPhonenumber(address.getMobilePhone())) == true) {
                buf.append(", ").append(getString("address.phoneType.mobile"));
            } else if (form.getPhoneNumber().equals(extractPhonenumber(address.getPrivatePhone())) == true) {
                buf.append(", ").append(getString("address.phoneType.private"));
            }
            buf.append(" #").append(address.getId());
        } else {
            buf.append("???");
        }
        final HttpClient client = new HttpClient();
        String url = ConfigXml.getInstance().getTelephoneSystemUrl();
        url = StringUtils.replaceOnce(url, "#source", form.getMyCurrentPhoneId());
        url = StringUtils.replaceOnce(url, "#target", form.getPhoneNumber());
        final String urlProtected = StringHelper.hideStringEnding(url, 'x', 3);
        final GetMethod method = new GetMethod(url);
        String errorKey = null;
        try {
            form.lastSuccessfulPhoneCall = new Date();
            client.executeMethod(method);
            final String resultStatus = method.getResponseBodyAsString();
            if ("0".equals(resultStatus) == true) {
                result = DateTimeFormatter.instance().getFormattedDateTime(new Date()) + ": "
                        + getString("address.phoneCall.result.successful");
                form.getRecentSearchTermsQueue().append(buf.toString());
            } else if ("2".equals(resultStatus) == true) {
                errorKey = "address.phoneCall.result.wrongSourceNumber";
            } else if ("3".equals(resultStatus) == true) {
                errorKey = "address.phoneCall.result.wrongDestinationNumber";
            } else {
                errorKey = "address.phoneCall.result.callingError";
            }
        } catch (final HttpException ex) {
            result = "Call failed. Please contact administrator.";
            log.fatal(result + ": " + urlProtected);
            throw new RuntimeException(ex);
        } catch (final IOException ex) {
            result = "Call failed. Please contact administrator.";
            log.fatal(result + ": " + urlProtected);
            throw new RuntimeException(ex);
        }
        if (errorKey != null) {
            form.addError(errorKey);
        }
    }

    protected String getRecentMyPhoneId() {
        return (String) getUserPrefEntry(USER_PREF_KEY_MY_RECENT_PHONE_ID);
    }

    protected void setRecentMyPhoneId(final String myPhoneId) {
        putUserPrefEntry(USER_PREF_KEY_MY_RECENT_PHONE_ID, myPhoneId, true);
    }

    @Override
    protected void onAfterRender() {
        super.onAfterRender();
        result = null;
    }

    /**
     * @return This page as link with the page parameters of this page.
     */
    @Override
    public String getPageAsLink() {
        return getPageAsLink(new PageParameters());
    }

    @Override
    protected String[] getBookmarkableInitialProperties() {
        return BOOKMARKABLE_SELECT_PROPERTIES;
    }

    @Override
    protected String getTitle() {
        return getString("address.phoneCall.title");
    }
}