/*
* TeleStax, Open Source Cloud Communications Copyright 2012.
* and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.mobicents.protocols.ss7.tools.simulator.level2;
import org.apache.log4j.Level;
import org.mobicents.protocols.ss7.indicator.NatureOfAddress;
import org.mobicents.protocols.ss7.indicator.NumberingPlan;
import org.mobicents.protocols.ss7.indicator.RoutingIndicator;
import org.mobicents.protocols.ss7.mtp.Mtp3UserPart;
import org.mobicents.protocols.ss7.sccp.OriginationType;
import org.mobicents.protocols.ss7.sccp.RemoteSignalingPointCode;
import org.mobicents.protocols.ss7.sccp.RemoteSubSystem;
import org.mobicents.protocols.ss7.sccp.Router;
import org.mobicents.protocols.ss7.sccp.RuleType;
import org.mobicents.protocols.ss7.sccp.SccpProvider;
import org.mobicents.protocols.ss7.sccp.SccpResource;
import org.mobicents.protocols.ss7.sccp.SccpStack;
import org.mobicents.protocols.ss7.sccp.SccpProtocolVersion;
import org.mobicents.protocols.ss7.sccp.impl.SccpStackImpl;
import org.mobicents.protocols.ss7.sccp.impl.router.RouterImpl;
import org.mobicents.protocols.ss7.sccp.parameter.GlobalTitle;
import org.mobicents.protocols.ss7.sccp.parameter.ParameterFactory;
import org.mobicents.protocols.ss7.sccp.parameter.SccpAddress;
import org.mobicents.protocols.ss7.tools.simulator.Stoppable;
import org.mobicents.protocols.ss7.tools.simulator.management.TesterHost;
/**
*
* @author sergey vetyutnev
*
*/
public class SccpMan implements SccpManMBean, Stoppable {
public static String SOURCE_NAME = "SCCP";
private final String name;
private TesterHost testerHost;
private Mtp3UserPart mtp3UserPart;
private SccpStackImpl sccpStack;
private SccpProvider sccpProvider;
private ParameterFactory parameterFactory;
private SccpResource resource;
private Router router;
private boolean isRspcUp = true;
private boolean isRssUp = true;
public SccpMan() {
this.name = "???";
}
public SccpMan(String name) {
this.name = name;
}
public void setTesterHost(TesterHost testerHost) {
this.testerHost = testerHost;
}
public void setMtp3UserPart(Mtp3UserPart val) {
this.mtp3UserPart = val;
}
public SccpStack getSccpStack() {
return this.sccpStack;
}
@Override
public boolean isRouteOnGtMode() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().isRouteOnGtMode();
}
@Override
public void setRouteOnGtMode(boolean val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setRouteOnGtMode(val);
this.testerHost.markStore();
}
@Override
public int getRemoteSpc() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getRemoteSpc();
}
@Override
public void setRemoteSpc(int val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setRemoteSpc(val);
this.testerHost.markStore();
}
@Override
public int getLocalSpc() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getLocalSpc();
}
@Override
public void setLocalSpc(int val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setLocalSpc(val);
this.testerHost.markStore();
}
@Override
public int getNi() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getNi();
}
@Override
public void setNi(int val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setNi(val);
this.testerHost.markStore();
}
@Override
public int getRemoteSsn() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getRemoteSsn();
}
@Override
public void setRemoteSsn(int val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setRemoteSsn(val);
this.testerHost.markStore();
}
@Override
public int getLocalSsn() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getLocalSsn();
}
@Override
public void setLocalSsn(int val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setLocalSsn(val);
this.testerHost.markStore();
}
@Override
public GlobalTitleType getGlobalTitleType() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getGlobalTitleType();
}
@Override
public String getGlobalTitleType_Value() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getGlobalTitleType().toString();
}
@Override
public void setGlobalTitleType(GlobalTitleType val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setGlobalTitleType(val);
this.testerHost.markStore();
}
@Override
public NatureOfAddressType getNatureOfAddress() {
return new NatureOfAddressType(this.testerHost.getConfigurationData().getSccpConfigurationData().getNatureOfAddress()
.getValue());
}
@Override
public String getNatureOfAddress_Value() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getNatureOfAddress().toString();
}
@Override
public void setNatureOfAddress(NatureOfAddressType val) {
this.testerHost.getConfigurationData().getSccpConfigurationData()
.setNatureOfAddress(NatureOfAddress.valueOf(val.intValue()));
this.testerHost.markStore();
}
@Override
public NumberingPlanSccpType getNumberingPlan() {
return new NumberingPlanSccpType(this.testerHost.getConfigurationData().getSccpConfigurationData().getNumberingPlan()
.getValue());
}
@Override
public String getNumberingPlan_Value() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getNumberingPlan().toString();
}
@Override
public void setNumberingPlan(NumberingPlanSccpType val) {
this.testerHost.getConfigurationData().getSccpConfigurationData()
.setNumberingPlan(NumberingPlan.valueOf(val.intValue()));
this.testerHost.markStore();
}
@Override
public SccpProtocolVersionType getSccpProtocolVersion() {
return new SccpProtocolVersionType(this.testerHost.getConfigurationData().getSccpConfigurationData().getSccpProtocolVersion().getValue());
}
@Override
public String getSccpProtocolVersion_Value() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getSccpProtocolVersion().toString();
}
@Override
public void setSccpProtocolVersion(SccpProtocolVersionType val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setSccpProtocolVersion(SccpProtocolVersion.valueOf(val.intValue()));
this.testerHost.markStore();
}
@Override
public int getTranslationType() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getTranslationType();
}
@Override
public void setTranslationType(int val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setTranslationType(val);
this.testerHost.markStore();
}
@Override
public String getCallingPartyAddressDigits() {
return this.testerHost.getConfigurationData().getSccpConfigurationData().getCallingPartyAddressDigits();
}
@Override
public void setCallingPartyAddressDigits(String val) {
this.testerHost.getConfigurationData().getSccpConfigurationData().setCallingPartyAddressDigits(val);
this.testerHost.markStore();
}
@Override
public void putGlobalTitleType(String val) {
GlobalTitleType x = GlobalTitleType.createInstance(val);
if (x != null)
this.setGlobalTitleType(x);
}
@Override
public void putNatureOfAddress(String val) {
NatureOfAddressType x = NatureOfAddressType.createInstance(val);
if (x != null)
this.setNatureOfAddress(x);
}
@Override
public void putNumberingPlan(String val) {
NumberingPlanSccpType x = NumberingPlanSccpType.createInstance(val);
if (x != null)
this.setNumberingPlan(x);
}
@Override
public void putSccpProtocolVersion(String val) {
SccpProtocolVersionType x = SccpProtocolVersionType.createInstance(val);
if (x != null)
this.setSccpProtocolVersion(x);
}
@Override
public String getState() {
StringBuilder sb = new StringBuilder();
sb.append("SCCP: Rspc: ");
sb.append(this.isRspcUp ? "Enabled" : "Disabled");
sb.append(" Rss: ");
sb.append(this.isRssUp ? "Enabled" : "Disabled");
return sb.toString();
}
public boolean start() {
try {
this.isRspcUp = true;
this.isRssUp = true;
this.initSccp(this.mtp3UserPart, this.testerHost.getConfigurationData().getSccpConfigurationData().getRemoteSsn(), this.testerHost
.getConfigurationData().getSccpConfigurationData().getLocalSsn(), this.testerHost.getConfigurationData().getSccpConfigurationData()
.getRemoteSpc(), this.testerHost.getConfigurationData().getSccpConfigurationData().getLocalSpc(), this.testerHost.getConfigurationData()
.getSccpConfigurationData().getNi(), this.testerHost.getConfigurationData().getSccpConfigurationData().getCallingPartyAddressDigits(),
this.testerHost.getPersistDir(), this.testerHost.getConfigurationData().getSccpConfigurationData().getSccpProtocolVersion());
this.testerHost.sendNotif(SOURCE_NAME, "SCCP has been started", "", Level.INFO);
return true;
} catch (Throwable e) {
this.testerHost.sendNotif(SOURCE_NAME, "Exception when starting SccpMan", e, Level.ERROR);
return false;
}
}
@Override
public void stop() {
try {
this.stopSccp();
this.testerHost.sendNotif(SOURCE_NAME, "SCCP has been stopped", "", Level.INFO);
} catch (Exception e) {
this.testerHost.sendNotif(SOURCE_NAME, "Exception when stopping SccpMan", e, Level.ERROR);
}
}
@Override
public void execute() {
if (this.resource != null) {
RemoteSignalingPointCode rspc = this.resource.getRemoteSpc(1);
RemoteSubSystem rss = this.resource.getRemoteSsn(1);
if (rspc != null) {
boolean conn = !rspc.isRemoteSpcProhibited();
if (this.isRspcUp != conn) {
this.isRspcUp = conn;
this.testerHost.sendNotif(SOURCE_NAME, "SCCP RemoteSignalingPoint is " + (conn ? "enabled" : "disabled"),
"Dpc=" + this.testerHost.getConfigurationData().getSccpConfigurationData().getRemoteSpc(),
Level.INFO);
}
}
if (rss != null) {
boolean conn = !rss.isRemoteSsnProhibited();
if (this.isRssUp != conn) {
this.isRssUp = conn;
this.testerHost.sendNotif(SOURCE_NAME, "SCCP RemoteSubSystem is " + (conn ? "enabled" : "disabled"), "Dpc="
+ this.testerHost.getConfigurationData().getSccpConfigurationData().getRemoteSpc() + " Ssn="
+ this.testerHost.getConfigurationData().getSccpConfigurationData().getRemoteSsn(), Level.INFO);
}
}
}
}
private void initSccp(Mtp3UserPart mtp3UserPart, int remoteSsn, int localSsn, int dpc, int opc, int ni, String callingPartyAddressDigits, String persistDir, SccpProtocolVersion sccpProtocolVersion)
throws Exception {
this.sccpStack = new SccpStackImpl("TestingSccp");
this.sccpStack.setPersistDir(persistDir);
this.sccpStack.setMtp3UserPart(1, mtp3UserPart);
this.sccpStack.start();
this.sccpStack.removeAllResourses();
this.sccpStack.setSccpProtocolVersion(sccpProtocolVersion);
this.sccpStack.getRouter().addMtp3ServiceAccessPoint(1, 1, opc, ni, 0);
this.sccpStack.getRouter().addMtp3Destination(1, 1, dpc, dpc, 0, 255, 255);
this.sccpProvider = this.sccpStack.getSccpProvider();
this.parameterFactory = this.sccpProvider.getParameterFactory();
// router1 = sccpStack1.getRouter();
this.resource = this.sccpStack.getSccpResource();
this.resource.addRemoteSpc(1, dpc, 0, 0);
this.resource.addRemoteSsn(1, dpc, remoteSsn, 0, false);
if (this.testerHost.getConfigurationData().getSccpConfigurationData().isRouteOnGtMode()) {
this.router = this.sccpStack.getRouter();
this.router.addRoutingAddress(1,parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, this.createGlobalTitle(""), dpc, 0));
this.router.addRoutingAddress(2,
parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, this.createGlobalTitle(""), opc, localSsn));
SccpAddress pattern = parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, this.createGlobalTitle("*"), 0,
0);
String mask = "K";
((RouterImpl) this.router).addRule(1, RuleType.SOLITARY, null, OriginationType.LOCAL, pattern, mask, 1,
-1, null, 0, pattern);
pattern = parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, this.createGlobalTitle("*"), 0, 0);
mask = "R";
((RouterImpl) this.router).addRule(2, RuleType.SOLITARY, null, OriginationType.REMOTE, pattern, mask, 2,
-1, null, 0, pattern);
}
}
private void stopSccp() {
this.sccpStack.removeAllResourses();
this.sccpStack.stop();
}
public SccpAddress createCallingPartyAddress() {
if (this.testerHost.getConfigurationData().getSccpConfigurationData().isRouteOnGtMode()) {
return parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, createGlobalTitle(this.testerHost
.getConfigurationData().getSccpConfigurationData().getCallingPartyAddressDigits()), 0, this.testerHost
.getConfigurationData().getSccpConfigurationData().getLocalSsn());
} else {
return parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, null, this.testerHost.getConfigurationData()
.getSccpConfigurationData().getLocalSpc(), this.testerHost.getConfigurationData()
.getSccpConfigurationData().getLocalSsn());
}
}
public SccpAddress createCalledPartyAddress() {
return parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, null, this.testerHost.getConfigurationData()
.getSccpConfigurationData().getRemoteSpc(), this.testerHost.getConfigurationData()
.getSccpConfigurationData().getRemoteSsn());
}
public SccpAddress createCalledPartyAddress(String address, int ssn) {
if (this.testerHost.getConfigurationData().getSccpConfigurationData().isRouteOnGtMode()) {
return parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, createGlobalTitle(address),0,
(ssn >= 0 ? ssn : this.testerHost.getConfigurationData().getSccpConfigurationData().getRemoteSsn()));
} else {
return createCalledPartyAddress();
}
}
public GlobalTitle createGlobalTitle(String address) {
GlobalTitle gt = null;
switch (this.testerHost.getConfigurationData().getSccpConfigurationData().getGlobalTitleType().intValue()) {
case GlobalTitleType.VAL_NOA_ONLY:
gt = this.parameterFactory.createGlobalTitle(address,this.testerHost.getConfigurationData().getSccpConfigurationData()
.getNatureOfAddress());
break;
case GlobalTitleType.VAL_TT_ONLY:
gt = this.parameterFactory.createGlobalTitle(address,this.testerHost.getConfigurationData().getSccpConfigurationData()
.getTranslationType());
break;
case GlobalTitleType.VAL_TT_NP_ES:
gt = this.parameterFactory.createGlobalTitle(address,this.testerHost.getConfigurationData().getSccpConfigurationData()
.getTranslationType(), this.testerHost.getConfigurationData().getSccpConfigurationData()
.getNumberingPlan(), null);
break;
case GlobalTitleType.VAL_TT_NP_ES_NOA:
gt = this.parameterFactory.createGlobalTitle(address,this.testerHost.getConfigurationData().getSccpConfigurationData()
.getTranslationType(), this.testerHost.getConfigurationData().getSccpConfigurationData()
.getNumberingPlan(),null, this.testerHost.getConfigurationData().getSccpConfigurationData()
.getNatureOfAddress());
break;
}
return gt;
}
// public SccpAddress createDestAddress() {
// return parameterFactory.createSccpAddress(RoutingIndicator.ROUTING_BASED_ON_DPC_AND_SSN, this.remotePc, null, this.remoteSsn);
// }
}