/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program 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 2 of the License. * * 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.plugins.alertMobicents; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.Locale; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.alert.Alert; import org.rhq.core.domain.alert.notification.SenderResult; import org.rhq.core.domain.resource.Resource; import org.rhq.enterprise.server.alert.AlertManagerLocal; import org.rhq.enterprise.server.plugin.pc.alert.AlertSender; import org.rhq.enterprise.server.util.LookupUtil; /** * AlertSender that notifies users via Mobicents (voice, sms) * @author Heiko W. Rupp */ public class MobicentsSender extends AlertSender { private final Log log = LogFactory.getLog(MobicentsSender.class); @Override public SenderResult send(Alert alert) { String baseUrl = preferences.getSimpleValue("mobicentsServerUrl", "http://localhost:8080/mobicents"); String tel = alertParameters.getSimpleValue("targetAddress", null); if (tel == null) { log.warn("No number to call given, not sending"); return SenderResult.getSimpleFailure("No target address given"); } String kindString = alertParameters.getSimpleValue("kind", "VOICE"); MobiKind kind = MobiKind.valueOf(kindString); Integer alertId = alert.getId(); StringBuilder b = new StringBuilder("alertText="); Resource res = alert.getAlertDefinition().getResource(); AlertManagerLocal alertManager = LookupUtil.getAlertManager(); switch (kind) { case VOICE: b.append("Alert on resource "); do { b.append(res.getName()); res = res.getParentResource(); if (res != null) b.append(" with parent "); } while (res != null); b.append(". Cause is "); // Switch locale to english, as the voice synthesizer expects this for now Locale currentLocale = Locale.getDefault(); Locale.setDefault(Locale.ENGLISH); b.append(alertManager.prettyPrintAlertConditions(alert, false)); Locale.setDefault(currentLocale); boolean willBeDisabled = alertManager.willDefinitionBeDisabled(alert); if (willBeDisabled) b.append(" The alert definition will now be disabled. \n\n"); // b.append(" Please press "); // // if (willBeDisabled) { // b.append(AlertFeedback.REENABLE.getText()); // } else { // b.append(AlertFeedback.DISABLE.getText()); // } // b.append(", "); // b.append(AlertFeedback.DELETE.getText()); // b.append(" or just hang up to do nothing."); break; case SMS: b.append("Alert: "); b.append(res.getName()); b.append(",id=(").append(res.getId()).append(")"); b.append("Brought by RHQ"); break; default: log.warn("Unsupported Mobicents notification type for now"); } URL url; int code = 0; HttpURLConnection conn = null; try { tel = tel.trim(); String telEnc = URLEncoder.encode(tel, "UTF-8"); // url encode tel-no, as it can contain '+' switch (kind) { case SMS: baseUrl = baseUrl + "sms"; // No trailing '/' ! break; case VOICE: baseUrl = baseUrl + "call"; // No trailing '/' ! break; default: baseUrl = baseUrl + "--not-supported-yet--"; } baseUrl = baseUrl + "?alertId=" + alertId; baseUrl = baseUrl + "&tel="; if (kind == MobiKind.VOICE) { if (!tel.startsWith("sip:")) { baseUrl = baseUrl + "sip:"; } } baseUrl = baseUrl + telEnc; if (kind == MobiKind.VOICE) { if (!tel.contains("@")) { // Append domain from preferences if user has none provided String domain = preferences.getSimpleValue("defaultVoipDomain", "localhost"); baseUrl = baseUrl + "@" + domain; } } // TODO SMS url log.info("Mobicents alert [" + kind + "] to baseUrl [" + baseUrl + "] with message:\n" + b.toString()); url = new URL(baseUrl); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setDoInput(true); OutputStream out = conn.getOutputStream(); //conn.addRequestProperty("text",b.toString()); // TODO encode? out.write(b.toString().getBytes()); out.flush(); conn.connect(); code = conn.getResponseCode(); } catch (Exception e) { log.warn("Notification via VoIP failed: " + e); return SenderResult.getSimpleFailure("Sending failed " + e.getMessage()); } finally { if (conn != null) conn.disconnect(); } if (code != 200) { log.info("Notification via Mobicents returned code " + code); return SenderResult.getSimpleFailure("Notification via Mobicents returned code " + code); } else { return SenderResult.getSimpleSuccess("Mobicents alert [" + kind + "] to baseUrl [" + baseUrl + "]"); } } }