O objetivo deste documento é mostrar como realizar testes utilizando o web service do Softswitch.
O teste foi realizado na versão 5 e utilizado como base o documento Integração - PCRT 5.6.1
O softswitch utiliza o padrão de arquitetura SOAP, para testar iremos utilizar o Soap Ui:
Ao iniciar o Soap Ui, criaremos um novo projeto:

Inserindo um link wsdl, ele irá procurar todos os requests disponíveis para serem utilizados. No exemplo foi inserido o link http://IP_INTERACE:PORTA/SipPulse/SubscriberWS?wsdl
mostrando todos requests relacionados à Subscriber
:
Após inserir o link deve aparecer a lista de requests disponíveis:

Para realizar a insersão de um assinante, basta dar dois cliques no request e irá abrir uma nova tela contendo todos dados disponíveis para serem enviados no request:

Preencher também as informações do usuário que irá enviar o request:
OBS: O usuário utilizado pela API é o mesmo utilizado para acessar a interface web. Caso haja necessidade deve ser criado um novo usuário na interface web:



Request completo
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.sippulse.voffice.com.br/">
<soapenv:Header/>
<soapenv:Body>
<ser:insertSubscriber>
<!--Optional:-->
<subscriber>
<!--Optional:-->
<accountCode>teste_integra3@ssw5.sippulse.com</accountCode>
<activeIncomingCalls>true</activeIncomingCalls>
<activeOutgoingCalls>true</activeOutgoingCalls>
<addServiceHeader>false</addServiceHeader>
<!--Optional:-->
<address></address>
<!--Optional:-->
<areaCode>48</areaCode>
<blockAnonymousCalls>true</blockAnonymousCalls>
<blockCollectCalls></blockCollectCalls>
<blockEntry0303>false</blockEntry0303>
<!--Optional:-->
<callFwd></callFwd>
<!--Optional:-->
<callLimit>0</callLimit>
<callsOnlyByIp>false</callsOnlyByIp>
<!--Optional:-->
<city></city>
<!--Optional:-->
<cityCode>55</cityCode>
<!--Optional:-->
<complement></complement>
<!--Optional:-->
<contractNumber></contractNumber>
<copyPassertedRpid>false</copyPassertedRpid>
<!--Optional:-->
<countryCode>55</countryCode>
<!--Optional:-->
<document></document>
<!--Optional:-->
<domain>ssw5.sippulse.com</domain>
<!--Optional:-->
<emailAddress>teste_integra3@sippulse.com</emailAddress>
<!--Optional:-->
<firstName></firstName>
<!--Optional:-->
<fwdBusy></fwdBusy>
<!--Optional:-->
<id></id>
<!--Optional:-->
<lastName></lastName>
<!--Optional:-->
<localArea>SC</localArea>
<lowCreditLimit>0.0</lowCreditLimit>
<lowCreditNotification>false</lowCreditNotification>
<!--Optional:-->
<mobile></mobile>
<!--Optional:-->
<noAnswer></noAnswer>
<!--Optional:-->
<number></number>
<!--Optional:-->
<password>teste123</password>
<!--Optional:-->
<passwordPortal>teste123</passwordPortal>
<!--Optional:-->
<phone></phone>
<!--Optional:-->
<profile>teste</profile>
<!--Optional:-->
<quarter></quarter>
<!--Optional:-->
<ratePlanId>2</ratePlanId>
<resellerBillingType></resellerBillingType>
<!--Optional:-->
<resellerId>1</resellerId>
<resellerMarkup>1</resellerMarkup>
<!--Optional:-->
<resellerRatePlanId></resellerRatePlanId>
<!--Optional:-->
<rings></rings>
<!--Optional:-->
<rpid></rpid>
<softphoneAllowed>true</softphoneAllowed>
<!--Optional:-->
<state></state>
<!--Optional:-->
<username>teste_integra3</username>
<validateSource0303>false</validateSource0303>
<!--Optional:-->
<voiceMailPassword>teste123</voiceMailPassword>
<voicemail>teste_integra3@sippulse.com</voicemail>
<!--Optional:-->
<zip></zip>
</subscriber>
<!--Optional:-->
<principal>
<!--Optional:-->
<login>suportepulse</login>
<!--Optional:-->
<password>@#ashdiuhs87856!!</password>
</principal>
</ser:insertSubscriber>
</soapenv:Body>
</soapenv:Envelope>
Identificando erros:
Os logs de insersão de dados podem ser consultados no log do glassfish, no exemplo a variável blockCollectCalls é do tipo boolean e é requirida para insersão de assinantes. No request foi enviado sem definir um valor:

cd /opt/glassfish/domains/domain1/logs
tail -f server.log
Ao clicar em executar no Soap UI é gerado um log no glassfish. Através dele é possível analisar e identificar a variável que está causando a falha:
at br.com.voffice.sippulse.ws.dto.SubscriberDTO$JaxbAccessorM_isBlockCollectCalls_setBlockCollectCalls_boolean.set(MethodAccessor_Boolean.java:59)

Outro caso que podemos encontrar na API SOAP é quando não há um usuário administrador no SSW e tentamos enviar uma requisição.

Não existe um log especificando o erro explicitamente, mas notamos a seguinte mensagem:
at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
O erro TransactionRolledbackLocalException
ocorre porque o GlassFish reverteu a transação devido a uma ArrayIndexOutOfBoundsException
, que acontece quando o código tenta acessar um índice inválido de um array ou lista vazia. Isso pode estar relacionado a dados ausentes ou inválidos (como login e senha no XML). Para resolver, valide os dados de entrada, trate exceções adequadamente no EJB, e revise os logs para entender melhor a origem do problema.