org.asteriskjava.util.AstUtil Maven / Gradle / Ivy
Show all versions of asterisk-java Show documentation
package org.asteriskjava.util;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
/**
* Some static utility methods to imitate Asterisk specific logic.
* See Asterisk's util.c
.
* Client code is not supposed to use this class.
*
* @author srt
* @version $Id$
*/
public class AstUtil {
private static final Set TRUE_LITERALS;
private static final Set NULL_LITERALS;
static {
TRUE_LITERALS = new HashSet<>(20);
TRUE_LITERALS.add("yes");
TRUE_LITERALS.add("true");
TRUE_LITERALS.add("y");
TRUE_LITERALS.add("t");
TRUE_LITERALS.add("1");
TRUE_LITERALS.add("on");
TRUE_LITERALS.add("enabled");
NULL_LITERALS = new HashSet<>(20);
NULL_LITERALS.add("");
NULL_LITERALS.add("unknown");
NULL_LITERALS.add("none"); // VarSet event in pbx.c
NULL_LITERALS.add("");
NULL_LITERALS.add("-none-"); // IPaddress in PeerEntryEvent
NULL_LITERALS.add("(none)");
NULL_LITERALS.add("");
NULL_LITERALS.add("(not set)");
NULL_LITERALS.add("");
NULL_LITERALS.add("n/a"); // channel in AgentsEvent
NULL_LITERALS.add("");
NULL_LITERALS.add("(null)"); // appData in ListDialplanEvent
}
private AstUtil() {
// hide constructor
}
/**
* Checks if a String represents true
or false
* according to Asterisk's logic.
* The original implementation is util.c
is as follows:
*
*
* int ast_true(const char *s)
* {
* if (!s || ast_strlen_zero(s))
* return 0;
*
* if (!strcasecmp(s, "yes") ||
* !strcasecmp(s, "true") ||
* !strcasecmp(s, "y") ||
* !strcasecmp(s, "t") ||
* !strcasecmp(s, "1") ||
* !strcasecmp(s, "on"))
* return -1;
*
* return 0;
* }
*
*
*
* To support the dnd property of
* {@link org.asteriskjava.manager.event.ZapShowChannelsEvent} this method
* also consideres the string "Enabled" as true.
*
* @param o the Object (usually a String) to check for true
.
* @return true
if s represents true
,
* false
otherwise.
*/
public static boolean isTrue(Object o) {
if (o == null) {
return false;
}
if (o instanceof Boolean) {
return (Boolean) o;
}
return TRUE_LITERALS.contains(o.toString().toLowerCase(Locale.US));
}
/**
* @param a an object
* @param b an object to be compared with {@code a} for equality
* @return {@code true} if the arguments are equal to each other and
* {@code false} otherwise
*/
public static boolean isEqual(Object a, Object b) {
return a == b || a != null && a.equals(b);
}
/**
* Parses a string for caller id information.
* The caller id string should be in the form
* "Some Name" <1234>
.
* This resembles ast_callerid_parse
in callerid.c
* but strips any whitespace.
*
* @param s the string to parse
* @return a String[] with name (index 0) and number (index 1)
*/
public static String[] parseCallerId(String s) {
final String[] result = new String[2];
final int lbPosition;
final int rbPosition;
String name;
String number;
if (s == null) {
return result;
}
lbPosition = s.lastIndexOf('<');
rbPosition = s.lastIndexOf('>');
// no opening and closing brace? use value as CallerId name
if (lbPosition < 0 || rbPosition < 0) {
name = s.trim();
if (name.length() == 0) {
name = null;
}
result[0] = name;
return result;
}
number = s.substring(lbPosition + 1, rbPosition).trim();
if (number.length() == 0) {
number = null;
}
name = s.substring(0, lbPosition).trim();
if (name.startsWith("\"") && name.endsWith("\"") && name.length() > 1) {
name = name.substring(1, name.length() - 1).trim();
}
if (name.length() == 0) {
name = null;
}
result[0] = name;
result[1] = number;
return result;
}
/**
* Checks if the value of s was null
in Asterisk.
* This method is useful as Asterisk likes to replace null
* values with different string values like "unknown", "<unknown>" or
* "<null>".
* To find such replacements search for S_OR
in Asterisk's
* source code. You will find things like
*
*
* S_OR(chan->cid.cid_num, "<unknown>")
* fdprintf(fd, "agi_callerid: %s\n", S_OR(chan->cid.cid_num, "unknown"));
*
*
* and more...
*
* @param s the string to test, may be null
. If s is not a
* string the only test that is performed is a check for
* null
.
* @return true
if the s was null
in Asterisk;
* false
otherwise.
*/
public static boolean isNull(Object s) {
if (s == null) {
return true;
}
if (!(s instanceof String)) {
return false;
}
return NULL_LITERALS.contains(((String) s).toLowerCase(Locale.US));
}
/**
* Converts a non-standard Asterisk boolean String value into something the Boolean class
* String constructor recognizes.
*
* Asterisk can return various strings that represent truth values.
* This method converts them into standard True/False, or null if null.
*
* @param value
* @return true
if the String is "true" or "yes" (case insensitive).
* false
if the String is "false" or "no" (case insensitive).
* null
if the String is null.
* @throws IllegalArgumentException
if any other value not listed above.
*/
public static String convertAsteriskBooleanStringToStandardBooleanString(String value) {
if (value == null) return null;
switch (value.toLowerCase()) {
case "true":
case "yes":
return "True";
case "false":
case "no":
return "False";
default:
throw new IllegalArgumentException("value of:" + value + " was not recognized as a boolean");
}
}
}