/*
* TeleStax, Open Source Cloud Communications
* Copyright 2011-2016, Telestax Inc and individual contributors
* by the @authors tag.
*
* This program is free software: you can redistribute it and/or modify
* under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation; either version 3 of
* the License, or (at your option) any later version.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package org.mobicents.protocols.ss7.tools.simulator.tests.checkimei;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.log4j.Level;
import org.mobicents.protocols.ss7.map.api.MAPApplicationContext;
import org.mobicents.protocols.ss7.map.api.MAPApplicationContextName;
import org.mobicents.protocols.ss7.map.api.MAPApplicationContextVersion;
import org.mobicents.protocols.ss7.map.api.MAPDialog;
import org.mobicents.protocols.ss7.map.api.MAPDialogListener;
import org.mobicents.protocols.ss7.map.api.MAPException;
import org.mobicents.protocols.ss7.map.api.MAPParameterFactory;
import org.mobicents.protocols.ss7.map.api.MAPProvider;
import org.mobicents.protocols.ss7.map.api.dialog.MAPUserAbortChoice;
import org.mobicents.protocols.ss7.map.api.primitives.IMEI;
import org.mobicents.protocols.ss7.map.api.primitives.MAPExtensionContainer;
import org.mobicents.protocols.ss7.map.api.service.mobility.MAPDialogMobility;
import org.mobicents.protocols.ss7.map.api.service.mobility.MAPServiceMobilityListener;
import org.mobicents.protocols.ss7.map.api.service.mobility.authentication.AuthenticationFailureReportRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.authentication.AuthenticationFailureReportResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.authentication.SendAuthenticationInfoRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.authentication.SendAuthenticationInfoResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.faultRecovery.ForwardCheckSSIndicationRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.faultRecovery.ResetRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.faultRecovery.RestoreDataRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.faultRecovery.RestoreDataResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.imei.CheckImeiRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.imei.CheckImeiResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.imei.RequestedEquipmentInfo;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.CancelLocationRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.CancelLocationResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.PurgeMSRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.PurgeMSResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.SendIdentificationRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.SendIdentificationResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.UpdateGprsLocationRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.UpdateGprsLocationResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.UpdateLocationRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.locationManagement.UpdateLocationResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.oam.ActivateTraceModeRequest_Mobility;
import org.mobicents.protocols.ss7.map.api.service.mobility.oam.ActivateTraceModeResponse_Mobility;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.AnyTimeInterrogationRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.AnyTimeInterrogationResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.AnyTimeSubscriptionInterrogationRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.AnyTimeSubscriptionInterrogationResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.ProvideSubscriberInfoRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberInformation.ProvideSubscriberInfoResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberManagement.DeleteSubscriberDataRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberManagement.DeleteSubscriberDataResponse;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberManagement.InsertSubscriberDataRequest;
import org.mobicents.protocols.ss7.map.api.service.mobility.subscriberManagement.InsertSubscriberDataResponse;
import org.mobicents.protocols.ss7.map.dialog.MAPUserAbortChoiceImpl;
import org.mobicents.protocols.ss7.tcap.asn.comp.Problem;
import org.mobicents.protocols.ss7.tools.simulator.Stoppable;
import org.mobicents.protocols.ss7.tools.simulator.common.TesterBase;
import org.mobicents.protocols.ss7.tools.simulator.level3.MapMan;
import org.mobicents.protocols.ss7.tools.simulator.level3.MapProtocolVersion;
import org.mobicents.protocols.ss7.tools.simulator.management.TesterHost;
/**
* @author mnowa
*
*/
public class TestCheckImeiClientMan extends TesterBase implements TestCheckImeiClientManMBean, Stoppable, MAPDialogListener, MAPServiceMobilityListener {
public static String SOURCE_NAME = "TestCheckImeiClient";
private final String name;
private MapMan mapMan;
MAPDialogMobility currentDialog = null;
private boolean isStarted = false;
private int countCheckImeiReq = 0;
private int countCheckImeiResp = 0;
private String currentRequestDef = "";
private boolean needSendSend = false;
private boolean needSendClose = false;
private AtomicInteger nbConcurrentDialogs = new AtomicInteger();
private MessageSender sender = null;
public TestCheckImeiClientMan() {
super(SOURCE_NAME);
this.name = "???";
}
public TestCheckImeiClientMan(String name) {
super(SOURCE_NAME);
this.name = name;
}
public void setTesterHost(TesterHost testerHost) {
this.testerHost = testerHost;
}
public void setMapMan(MapMan val) {
this.mapMan = val;
}
@Override
public String closeCurrentDialog() {
if (!isStarted)
return "The tester is not started";
if (this.sender != null)
return "The tester is not in a manual mode";
MAPDialogMobility curDialog = currentDialog;
if (curDialog != null) {
try {
MAPUserAbortChoice choice = new MAPUserAbortChoiceImpl();
choice.setUserSpecificReason();
curDialog.abort(choice);
this.doRemoveDialog();
return "The current dialog has been closed";
} catch (MAPException e) {
this.doRemoveDialog();
return "Exception when closing the current dialog: " + e.toString();
}
} else {
return "No current dialog";
}
}
private void doRemoveDialog() {
currentDialog = null;
// currentRequestDef = "";
}
@Override
public String performCheckImeiRequest(String imei) {
if (!isStarted)
return "The tester is not started";
if (this.sender != null)
return "The tester is not in manual mode";
MAPDialogMobility curDialog = currentDialog;
if (curDialog != null)
return "The current dialog exists. Finish it previousely";
if (imei == null || imei.equals(""))
return "Imei is empty";
currentRequestDef = "";
return doCheckImeiRequest(imei, true);
}
private String doCheckImeiRequest(String imeiString, boolean manualMode) {
MAPApplicationContextVersion mapAppCtxVersion;
switch (this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getMapProtocolVersion().intValue()) {
case MapProtocolVersion.VAL_MAP_V1:
mapAppCtxVersion = MAPApplicationContextVersion.version1;
break;
case MapProtocolVersion.VAL_MAP_V2:
mapAppCtxVersion = MAPApplicationContextVersion.version2;
break;
default:
mapAppCtxVersion = MAPApplicationContextVersion.version3;
break;
}
MAPApplicationContext mapAppContext = MAPApplicationContext.getInstance(MAPApplicationContextName.equipmentMngtContext, mapAppCtxVersion);
try {
MAPProvider mapProvider = this.mapMan.getMAPStack().getMAPProvider();
MAPDialogMobility dialog = mapProvider.getMAPServiceMobility().createNewDialog(mapAppContext,
this.mapMan.createOrigAddress(), null,
this.mapMan.createDestAddress(), null);
if (manualMode)
currentDialog = dialog;
MAPParameterFactory mapParameterFactory = mapProvider.getMAPParameterFactory();
IMEI imei = mapParameterFactory.createIMEI(imeiString);
RequestedEquipmentInfo requestedEquipmentInfo = mapParameterFactory.createRequestedEquipmentInfo(true, false);
MAPExtensionContainer extensionContainer = null;
//MAPExtensionContainer extensionContainer = MAPExtensionContainerTest.GetTestExtensionContainer();
dialog.addCheckImeiRequest(imei, requestedEquipmentInfo, extensionContainer);
dialog.send();
this.countCheckImeiReq++;
if (manualMode || !this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().isOneNotificationFor100Dialogs()) {
currentRequestDef += "Sent CheckImeiRequest: " + imei + ";";
String data = createCheckImeiReqData(dialog.getLocalDialogId(), imeiString);
this.testerHost.sendNotif(SOURCE_NAME, "Sent: CheckImeiRequest: " + imei, data, Level.DEBUG);
} else if (!manualMode && this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().isOneNotificationFor100Dialogs()) {
if (countCheckImeiReq %100 == 0) {
currentRequestDef += "Sent: CheckImeiRequest: " + countCheckImeiReq + " messages sent;";
this.testerHost.sendNotif(SOURCE_NAME, "Sent: CheckImeiRequest: " + countCheckImeiReq + " messages sent", "", Level.DEBUG);
}
}
return "checkImeiRequest has been sent";
} catch (MAPException ex) {
return "Exception when sending CheckImeiRequest: " + ex.toString();
}
}
private String createCheckImeiReqData(Long dialogId, String imei) {
StringBuilder sb = new StringBuilder();
sb.append("dialogId=");
sb.append(dialogId);
sb.append(", imei=\"");
sb.append(imei);
sb.append("\"");
return sb.toString();
}
// Dialog messgaes
@Override
public void onRejectComponent(MAPDialog mapDialog, Long invokeId, Problem problem, boolean isLocalOriginated) {
super.onRejectComponent(mapDialog, invokeId, problem, isLocalOriginated);
if (isLocalOriginated)
needSendClose = true;
}
@Override
public void onDialogDelimiter(MAPDialog mapDialog) {
try {
if (needSendSend) {
needSendSend = false;
mapDialog.send();
return;
}
} catch (Exception e) {
this.testerHost.sendNotif(SOURCE_NAME, "Exception when invoking send() : " + e.getMessage(), e, Level.ERROR);
return;
}
try {
if (needSendClose) {
needSendClose = false;
mapDialog.close(false);
return;
}
} catch (Exception e) {
this.testerHost.sendNotif(SOURCE_NAME, "Exception when invoking close() : " + e.getMessage(), e, Level.ERROR);
return;
}
}
@Override
public void onDialogRelease(MAPDialog mapDialog) {
if (this.currentDialog == mapDialog)
this.doRemoveDialog();
nbConcurrentDialogs.decrementAndGet();
if (this.sender != null) {
if (nbConcurrentDialogs.get() < this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData()
.getMaxConcurrentDialogs() / 2)
this.sender.notify();
}
}
private class MessageSender implements Runnable {
private boolean needStop = false;
public void stop() {
needStop = true;
}
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (true) {
if (needStop)
break;
if (nbConcurrentDialogs.get() < testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData()
.getMaxConcurrentDialogs()) {
doCheckImeiRequest(testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData()
.getImei(), false);
nbConcurrentDialogs.incrementAndGet();
}
if (nbConcurrentDialogs.get() >= testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData()
.getMaxConcurrentDialogs()) {
try {
this.wait(100);
} catch (Exception ex) {
}
}
}
}
}
public boolean start() {
this.countCheckImeiReq = 0;
this.countCheckImeiResp = 0;
this.currentRequestDef = "";
MAPProvider mapProvider = this.mapMan.getMAPStack().getMAPProvider();
mapProvider.getMAPServiceMobility().acivate();
mapProvider.getMAPServiceMobility().addMAPServiceListener(this);
mapProvider.addMAPDialogListener(this);
this.testerHost.sendNotif(SOURCE_NAME, "CHECK IMEI Client has been started", "", Level.INFO);
isStarted = true;
if (this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getCheckImeiClientAction().intValue() == CheckImeiClientAction.VAL_AUTO_SendCheckImeiRequest) {
nbConcurrentDialogs = new AtomicInteger();
this.sender = new MessageSender();
Thread thr = new Thread(this.sender);
thr.start();
}
return true;
}
// Stoppable interface methods
@Override
public void stop() {
MAPProvider mapProvider = this.mapMan.getMAPStack().getMAPProvider();
isStarted = false;
if (this.sender != null) {
this.sender.stop();
try {
this.sender.notify();
} catch (Exception e) {
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
this.sender = null;
}
this.doRemoveDialog();
mapProvider.getMAPServiceMobility().deactivate();
mapProvider.getMAPServiceMobility().removeMAPServiceListener(this);
mapProvider.removeMAPDialogListener(this);
this.testerHost.sendNotif(SOURCE_NAME, "CHECK IMEI Client has been stopped", "", Level.INFO);
}
@Override
public void execute() {
}
@Override
public String getState() {
StringBuilder sb = new StringBuilder();
sb.append("<html>");
sb.append(SOURCE_NAME);
sb.append(": CurDialog=");
MAPDialogMobility curDialog = currentDialog;
if (curDialog != null)
sb.append(curDialog.getLocalDialogId());
else
sb.append("No");
sb.append("<br>Count: countCheckImeiReq-");
sb.append(countCheckImeiReq);
sb.append(", countCheckImeiResp-");
sb.append(countCheckImeiResp);
sb.append("</html>");
return sb.toString();
}
// TestCheckImeiClientManMBean interface methods
@Override
public String getImei() {
return this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getImei();
}
@Override
public void setImei(String imei) {
this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().setImei(imei);
this.testerHost.markStore();
}
@Override
public MapProtocolVersion getMapProtocolVersion() {
return this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getMapProtocolVersion();
}
@Override
public String getMapProtocolVersion_Value() {
return this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getMapProtocolVersion().toString();
}
@Override
public void setMapProtocolVersion(MapProtocolVersion mapVersion) {
this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().setMapProtocolVersion(mapVersion);
this.testerHost.markStore();
}
@Override
public void putMapProtocolVersion(String val) {
MapProtocolVersion x = MapProtocolVersion.createInstance(val);
if (x != null)
this.setMapProtocolVersion(x);
}
@Override
public CheckImeiClientAction getCheckImeiClientAction() {
return this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getCheckImeiClientAction();
}
@Override
public String getCheckImeiClientAction_Value() {
return this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getCheckImeiClientAction().toString();
}
@Override
public void setCheckImeiClientAction(CheckImeiClientAction val) {
this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().setCheckImeiClientAction(val);
this.testerHost.markStore();
}
@Override
public void putCheckImeiClientAction(String val) {
CheckImeiClientAction x = CheckImeiClientAction.createInstance(val);
if (x != null)
this.setCheckImeiClientAction(x);
}
@Override
public int getMaxConcurrentDialogs() {
return this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getMaxConcurrentDialogs();
}
@Override
public void setMaxConcurrentDialogs(int val) {
this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().setMaxConcurrentDialogs(val);
this.testerHost.markStore();
}
@Override
public boolean isOneNotificationFor100Dialogs() {
return this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().isOneNotificationFor100Dialogs();
}
@Override
public void setOneNotificationFor100Dialogs(boolean val) {
this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().setOneNotificationFor100Dialogs(val);
this.testerHost.markStore();
}
@Override
public String getCurrentRequestDef() {
if (this.currentDialog != null)
return "CurDialog: " + currentRequestDef;
else
return "PrevDialog: " + currentRequestDef;
}
// key MAPServiceMobilityListener interface methods
@Override
public void onCheckImeiResponse(CheckImeiResponse response) {
if (!isStarted)
return;
this.countCheckImeiResp++;
if (this.sender == null) {
MAPDialogMobility curDialog = currentDialog;
if (curDialog != response.getMAPDialog())
return;
currentRequestDef += "Rsvd CheckImeiResp=\"" + "equipmentStatus=" + response.getEquipmentStatus() + "\";";
}
long invokeId = response.getMAPDialog().getLocalDialogId();
if (CheckImeiClientAction.VAL_MANUAL_OPERATION == this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getCheckImeiClientAction().intValue()
|| !this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().isOneNotificationFor100Dialogs()) {
String uData = this.createCheckImeiRespData(invokeId, response);
this.testerHost.sendNotif(SOURCE_NAME, "Rcvd: CheckImeiResp: " + "equipmentStatus=" + response.getEquipmentStatus(), uData, Level.DEBUG);
} else if (CheckImeiClientAction.VAL_AUTO_SendCheckImeiRequest == this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().getCheckImeiClientAction().intValue()
&& this.testerHost.getConfigurationData().getTestCheckImeiClientConfigurationData().isOneNotificationFor100Dialogs()) {
if (countCheckImeiReq %100 == 0) {
currentRequestDef += "Rcvd: CheckImeiResp: " + countCheckImeiResp + " messages received ("+countCheckImeiReq+" requests sent);";
this.testerHost.sendNotif(SOURCE_NAME, "Rcvd: CheckImeiResp: " + countCheckImeiResp + " messages received("+countCheckImeiReq+" requests sent)", "", Level.DEBUG);
}
}
this.doRemoveDialog();
}
private String createCheckImeiRespData(long dialogId, CheckImeiResponse response) {
StringBuilder sb = new StringBuilder();
sb.append("dialogId=");
sb.append(dialogId);
sb.append(", response=\"");
sb.append(response);
sb.append("\"");
return sb.toString();
}
@Override
public void onCheckImeiRequest(CheckImeiRequest request) {
// TODO Auto-generated method stub
}
// other MAPServiceMobilityListener interface methods
@Override
public void onUpdateLocationRequest(UpdateLocationRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onUpdateLocationResponse(UpdateLocationResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onCancelLocationRequest(CancelLocationRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onCancelLocationResponse(CancelLocationResponse response) {
// TODO Auto-generated method stub
}
@Override
public void onSendIdentificationRequest(SendIdentificationRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onSendIdentificationResponse(SendIdentificationResponse response) {
// TODO Auto-generated method stub
}
@Override
public void onUpdateGprsLocationRequest(UpdateGprsLocationRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onUpdateGprsLocationResponse(UpdateGprsLocationResponse response) {
// TODO Auto-generated method stub
}
@Override
public void onPurgeMSRequest(PurgeMSRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onPurgeMSResponse(PurgeMSResponse response) {
// TODO Auto-generated method stub
}
@Override
public void onSendAuthenticationInfoRequest(SendAuthenticationInfoRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onSendAuthenticationInfoResponse(SendAuthenticationInfoResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onAuthenticationFailureReportRequest(AuthenticationFailureReportRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onAuthenticationFailureReportResponse(AuthenticationFailureReportResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onResetRequest(ResetRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onForwardCheckSSIndicationRequest(ForwardCheckSSIndicationRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onRestoreDataRequest(RestoreDataRequest ind) {
// TODO Auto-generated method stub
}
@Override
public void onRestoreDataResponse(RestoreDataResponse ind) {
// TODO Auto-generated method stub
}
@Override
public void onAnyTimeInterrogationRequest(AnyTimeInterrogationRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onAnyTimeInterrogationResponse(AnyTimeInterrogationResponse response) {
// TODO Auto-generated method stub
}
public void onAnyTimeSubscriptionInterrogationRequest(AnyTimeSubscriptionInterrogationRequest request) {
}
public void onAnyTimeSubscriptionInterrogationResponse(AnyTimeSubscriptionInterrogationResponse response) {
}
@Override
public void onProvideSubscriberInfoRequest(ProvideSubscriberInfoRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onProvideSubscriberInfoResponse(ProvideSubscriberInfoResponse response) {
// TODO Auto-generated method stub
}
@Override
public void onInsertSubscriberDataRequest(InsertSubscriberDataRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onInsertSubscriberDataResponse(InsertSubscriberDataResponse request) {
// TODO Auto-generated method stub
}
@Override
public void onDeleteSubscriberDataRequest(DeleteSubscriberDataRequest request) {
// TODO Auto-generated method stub
}
@Override
public void onDeleteSubscriberDataResponse(DeleteSubscriberDataResponse request) {
// TODO Auto-generated method stub
}
@Override
public void onActivateTraceModeRequest_Mobility(ActivateTraceModeRequest_Mobility ind) {
// TODO Auto-generated method stub
}
@Override
public void onActivateTraceModeResponse_Mobility(ActivateTraceModeResponse_Mobility ind) {
// TODO Auto-generated method stub
}
}