///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 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.markup.html.basic.Label; import org.apache.wicket.model.PropertyModel; 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.address.PhoneType; 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.URLHelper; import org.projectforge.web.calendar.DateTimeFormatter; import org.projectforge.web.wicket.AbstractStandardFormPage; public class SendSmsPage extends AbstractStandardFormPage { private static final long serialVersionUID = -1677859643101866297L; public final static String PARAMETER_KEY_ADDRESS_ID = "addressId"; public final static String PARAMETER_KEY_PHONE_TYPE = "phoneType"; public final static String PARAMETER_KEY_NUMBER = "number"; protected static final String[] BOOKMARKABLE_SELECT_PROPERTIES = new String[] { PARAMETER_KEY_ADDRESS_ID + "|address", PARAMETER_KEY_PHONE_TYPE + "|phone", PARAMETER_KEY_NUMBER + "|no"}; private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(SendSmsPage.class); @SpringBean(name = "addressDao") private AddressDao addressDao; private AddressDO address; private SendSmsForm form; String result; @SuppressWarnings("serial") public SendSmsPage(final PageParameters parameters) { super(parameters); form = new SendSmsForm(this); body.add(form); evaluateInitialPageParameters(getPageParameters()); form.init(); final String javaScript = "function showSendQuestionDialog() {\n return window.confirm('" + getString("address.sendSms.sendMessageQuestion") + "');\n}\n" + " $(document).ready(function() {\n" + " var onEditCallback = function(remaining) {\n" + " $('#charsRemaining').text(remaining + ' " + getString("charactersLeft") + "');\n" + " }\n" // TODO: Doesn't work with autocompletion! // + " $('textarea[maxlength]').limitMaxlength({\n" // + " onEdit: onEditCallback,\n" // + " });\n" + " });\n"; body.add(new Label("javascript", javaScript).setEscapeModelStrings(false)); form.add(new Label("result", new PropertyModel<String>(this, "result")) { @Override public boolean isVisible() { return StringUtils.isNotBlank(result); } }); } public Integer getAddressId() { return null; } public void setAddressId(final Integer addressId) { if (addressId != null) { address = addressDao.getById(addressId); } } public String getNumber() { final String number = getData().getPhoneNumber(); final int pos = number != null ? number.indexOf(':') : -1; if (pos > 0) { return number.substring(0, pos); } return number; } public void setNumber(final String number) { if (StringUtils.isNotBlank(number) == true) { getData().setPhoneNumber(number); } } public String getPhoneType() { return null; } public void setPhoneType(final String phoneType) { PhoneType type = null; try { type = PhoneType.valueOf(phoneType); } catch (final IllegalArgumentException ex) { } String number = null; if (type == PhoneType.MOBILE) { number = address.getMobilePhone(); } else if (type == PhoneType.PRIVATE_MOBILE) { number = address.getPrivateMobilePhone(); } if (number != null) { getData().setPhoneNumber( SendSmsForm.getPhoneNumberAndPerson(address, number, Configuration.getInstance().getStringValue(ConfigurationParam.DEFAULT_COUNTRY_PHONE_PREFIX))); } } protected void send() { final String number = NumberHelper.extractPhonenumber(getData().getPhoneNumber(), Configuration.getInstance().getStringValue(ConfigurationParam.DEFAULT_COUNTRY_PHONE_PREFIX)); if (StringUtils.isBlank(ConfigXml.getInstance().getSmsUrl()) == true) { log.error("Servlet url for sending sms not configured. SMS not supported."); return; } log.info("User sends message to destination number: '" + StringHelper.hideStringEnding(number, 'x', 3)); final HttpClient client = new HttpClient(); String url = ConfigXml.getInstance().getSmsUrl(); url = StringUtils.replaceOnce(url, "#number", number); url = StringUtils.replaceOnce(url, "#message", URLHelper.encode(getData().getMessage())); final GetMethod method = new GetMethod(url); String errorKey = null; result = ""; try { client.executeMethod(method); final String response = method.getResponseBodyAsString(); if (response == null) { errorKey = "address.sendSms.sendMessage.result.unknownError"; } else if (response.startsWith("0") == true) { result = getLocalizedMessage("address.sendSms.sendMessage.result.successful", number, DateTimeFormatter.instance() .getFormattedDateTime(new Date())); } else if (response.startsWith("1") == true) { errorKey = "address.sendSms.sendMessage.result.messageMissed"; } else if (response.startsWith("2") == true) { errorKey = "address.sendSms.sendMessage.result.wrongOrMissingNumber"; } else if (response.startsWith("3") == true) { errorKey = "address.sendSms.sendMessage.result.messageToLarge"; } else { errorKey = "address.sendSms.sendMessage.result.unknownError"; } } catch (final HttpException ex) { errorKey = "Call failed. Please contact administrator."; log.fatal(errorKey + ": " + ConfigXml.getInstance().getSmsUrl() + StringHelper.hideStringEnding(String.valueOf(number), 'x', 3)); throw new RuntimeException(ex); } catch (final IOException ex) { errorKey = "Call failed. Please contact administrator."; log.fatal(errorKey + ": " + ConfigXml.getInstance().getSmsUrl() + StringHelper.hideStringEnding(String.valueOf(number), 'x', 3)); throw new RuntimeException(ex); } if (errorKey != null) { form.addError(errorKey); } } @Override protected void onAfterRender() { super.onAfterRender(); result = null; } private SendSmsData getData() { return form.data; } /** * @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.sendSms.title"); } }