/** * */ package org.mobicents.smsc.domain; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.restcomm.smpp.oam.SmppOamMessages; import javolution.xml.XMLFormat; import javolution.xml.stream.XMLStreamException; /** * @author Amit Bhayani * */ public class Sip implements SipMBean { private static final String SIP_NAME = "name"; private static final String SIP_CLUSTER_NAME = "clusterName"; private static final String REMOTE_HOST_IP = "host"; private static final String REMOTE_HOST_PORT = "port"; private static final String NETWORK_ID = "networkId"; private static final String ROUTING_TON = "routingTon"; private static final String ROUTING_NPI = "routingNpi"; private static final String ROUTING_ADDRESS_RANGE = "routingAddressRange"; private static final String CHARGING_ENABLED = "chargingEnabled"; private static final String COUNTERS_ENABLED = "countersEnabled"; private static final String STARTED = "started"; private String name; private String clusterName; private String host; private int port; private int networkId; // Outgoing SMS should match these TON, NPI and addressRange. TON and NPI // can be -1 which means SMSC doesn't care for these fields and only // addressRange (pattern) should match private int routingTon = -1; private int routingNpi = -1; private String routingAddressRange; private Pattern routingAddressRangePattern; private boolean countersEnabled = true; private boolean chargingEnabled = false; private boolean isStarted = true; private String sipAddress = null; protected transient SipManagement sipManagement = null; public Sip() { } /** * */ public Sip(String name, String clusterName, String host, int port, boolean chargingEnabled, byte addressTon, byte addressNpi, String addressRange, boolean countersEnabled, int networkId) { this.name = name; this.clusterName = clusterName; this.host = host; this.port = port; this.resetSipAddress(); this.chargingEnabled = chargingEnabled; this.countersEnabled = countersEnabled; this.routingTon = addressTon; this.routingNpi = addressNpi; this.routingAddressRange = addressRange; this.networkId = networkId; resetPattern(); } /* * (non-Javadoc) * * @see org.mobicents.smsc.smpp.SipMBean#isStarted() */ @Override public boolean isStarted() { return this.isStarted; } /* * (non-Javadoc) * * @see org.mobicents.smsc.smpp.SipMBean#getName() */ @Override public String getName() { return this.name; } /* * (non-Javadoc) * * @see org.mobicents.smsc.smpp.SipMBean#getClusterName() */ @Override public String getClusterName() { return this.clusterName; } @Override public void setClusterName(String clusterName) { this.clusterName = clusterName; this.store(); } /** * @return the host */ @Override public String getHost() { return host; } /** * @param host * the host to set */ @Override public void setHost(String host) { this.host = host; this.resetSipAddress(); this.store(); } /** * @return the port */ @Override public int getPort() { return port; } /** * @param port * the port to set */ @Override public void setPort(int port) { this.port = port; this.resetSipAddress(); this.store(); } @Override public int getNetworkId() { return networkId; } @Override public void setNetworkId(int networkId) { this.networkId = networkId; this.store(); } @Override public int getRoutingNpi() { return this.routingNpi; } @Override public int getRoutingTon() { return this.routingTon; } @Override public String getRoutingAddressRange() { return this.routingAddressRange; } @Override public void setRoutingNpi(int npi) { this.routingNpi = npi; this.store(); } @Override public void setRoutingTon(int ton) { this.routingTon = ton; this.store(); } @Override public void setRoutingAddressRange(String range) { this.routingAddressRange = range; this.resetPattern(); this.store(); } @Override public boolean isCountersEnabled() { return countersEnabled; } @Override public void setCountersEnabled(boolean countersEnabled) { this.countersEnabled = countersEnabled; } @Override public boolean isChargingEnabled() { return chargingEnabled; } @Override public void setChargingEnabled(boolean chargingEnabled) { this.chargingEnabled = chargingEnabled; } public String getSipAddress() { return this.sipAddress; } protected boolean isRoutingAddressMatching(int destTon, int destNpi, String destAddress) { // Check sourceTon if (this.routingTon != -1 && this.routingTon != destTon) { return false; } // Check sourceNpi if (this.routingNpi != -1 && this.routingNpi != destNpi) { return false; } // Check sourceAddress if (this.routingAddressRangePattern == null) return false; Matcher m = this.routingAddressRangePattern.matcher(destAddress); if (m.matches()) { return true; } return false; } public void show(StringBuffer sb) { sb.append(SMSCOAMMessages.SHOW_SIP_NAME).append(this.name).append(SmppOamMessages.SHOW_CLUSTER_NAME) .append(this.clusterName).append(SmppOamMessages.SHOW_ESME_HOST).append(this.host) .append(SmppOamMessages.SHOW_ESME_PORT).append(this.port) .append(SmppOamMessages.SHOW_NETWORK_ID).append(this.networkId) .append(SMSCOAMMessages.SHOW_STARTED) .append(this.isStarted).append(SmppOamMessages.SHOW_ROUTING_ADDRESS_TON).append(this.routingTon) .append(SmppOamMessages.SHOW_ROUTING_ADDRESS_NPI).append(this.routingNpi) .append(SmppOamMessages.SHOW_ROUTING_ADDRESS).append(this.routingAddressRange) .append(SMSCOAMMessages.SHOW_COUNTERS_ENABLED).append(this.countersEnabled) .append(SmppOamMessages.CHARGING_ENABLED).append(this.chargingEnabled); sb.append(SMSCOAMMessages.NEW_LINE); } /** * XML Serialization/Deserialization */ protected static final XMLFormat<Sip> SIP_XML = new XMLFormat<Sip>(Sip.class) { @Override public void read(javolution.xml.XMLFormat.InputElement xml, Sip sip) throws XMLStreamException { sip.name = xml.getAttribute(SIP_NAME, ""); sip.clusterName = xml.getAttribute(SIP_CLUSTER_NAME, ""); sip.host = xml.getAttribute(REMOTE_HOST_IP, ""); sip.port = xml.getAttribute(REMOTE_HOST_PORT, -1); sip.networkId = xml.getAttribute(NETWORK_ID, 0); sip.resetSipAddress(); sip.isStarted = xml.getAttribute(STARTED, false); sip.routingTon = xml.getAttribute(ROUTING_TON, -1); sip.routingNpi = xml.getAttribute(ROUTING_NPI, -1); sip.routingAddressRange = xml.getAttribute(ROUTING_ADDRESS_RANGE, null); sip.resetPattern(); sip.countersEnabled = xml.getAttribute(COUNTERS_ENABLED, true); sip.chargingEnabled = xml.getAttribute(CHARGING_ENABLED, false); } @Override public void write(Sip sip, javolution.xml.XMLFormat.OutputElement xml) throws XMLStreamException { xml.setAttribute(SIP_NAME, sip.name); xml.setAttribute(SIP_CLUSTER_NAME, sip.clusterName); xml.setAttribute(REMOTE_HOST_IP, sip.host); xml.setAttribute(REMOTE_HOST_PORT, sip.port); xml.setAttribute(NETWORK_ID, sip.networkId); xml.setAttribute(STARTED, sip.isStarted); xml.setAttribute(ROUTING_TON, sip.routingTon); xml.setAttribute(ROUTING_NPI, sip.routingNpi); xml.setAttribute(ROUTING_ADDRESS_RANGE, sip.routingAddressRange); xml.setAttribute(COUNTERS_ENABLED, sip.countersEnabled); xml.setAttribute(CHARGING_ENABLED, sip.chargingEnabled); } }; private void resetSipAddress() { this.sipAddress = this.host + ":" + this.port; } private void resetPattern() { if (this.routingAddressRange != null) { this.routingAddressRangePattern = Pattern.compile(this.routingAddressRange); } } private void store() { this.sipManagement.store(); } }