Skip to content

Commit 0584b6e

Browse files
committed
Merge branch 'master' into restcomm-1581
# Conflicts: # restcomm/restcomm.interpreter/src/test/java/org/restcomm/connect/interpreter/NumberSelectorServiceTest.java
2 parents a7bd8a6 + 9b3f310 commit 0584b6e

6 files changed

Lines changed: 1831 additions & 2 deletions

File tree

restcomm/restcomm.interpreter/src/main/java/org/restcomm/connect/interpreter/NumberSelectorService.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ public NumberSelectionResult searchNumberWithResult(String phone,
279279
if (numberfound.number == null) {
280280
//only use regex if perfect match didnt worked
281281
if (destinationOrganizationSid != null
282-
&& destinationOrganizationSid.equals(sourceOrganizationSid)
282+
&& (sourceOrganizationSid == null || destinationOrganizationSid.equals(sourceOrganizationSid))
283283
&& phone.matches("[\\d,*,#,+]+")) {
284284
//check regex if source and dest orgs are the same
285285
//only use regex if org available
@@ -296,7 +296,26 @@ public NumberSelectionResult searchNumberWithResult(String phone,
296296
}
297297
}
298298
}
299+
}
300+
if (numberfound.number == null) {
301+
if (logger.isDebugEnabled()) {
302+
StringBuffer stringBuffer = new StringBuffer();
303+
304+
stringBuffer.append("NumberSelectionService didn't match a number because: ");
299305

306+
if (destinationOrganizationSid == null) {
307+
stringBuffer.append(" - Destination Org is null - ");
308+
} else if (sourceOrganizationSid != null && !destinationOrganizationSid.equals(sourceOrganizationSid)) {
309+
stringBuffer.append(" - Source Org is NOT null and DOESN'T match the Destination Org - ");
310+
} else if (!phone.matches("[\\d,*,#,+]+")) {
311+
String msg = String.format(" - Phone %s doesn't match regex \"[\\\\d,*,#,+]+\" - ", phone);
312+
stringBuffer.append(msg);
313+
} else {
314+
String msg = String.format(" - Phone %s didn't match any of the Regex - ",phone);
315+
stringBuffer.append(msg);
316+
}
317+
logger.debug(stringBuffer.toString());
318+
}
300319
}
301320
return numberfound;
302321
}

restcomm/restcomm.interpreter/src/test/java/org/restcomm/connect/interpreter/NumberSelectorServiceTest.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,4 +301,95 @@ public void testRegexMatch2() {
301301
}
302302

303303

304+
@Test
305+
public void testRegexMatchFromNullSrcOrg() {
306+
Sid srcSid = null;
307+
Sid destSid = Sid.generate(Sid.Type.ORGANIZATION);
308+
String regex = "12.*";
309+
String longestRegex = "123.*";
310+
List<IncomingPhoneNumber> emptyNumbers = new ArrayList();
311+
List<IncomingPhoneNumber> numbers = new ArrayList();
312+
final IncomingPhoneNumber.Builder builder = IncomingPhoneNumber.builder();
313+
builder.setPhoneNumber(regex);
314+
numbers.add(builder.build());
315+
builder.setPhoneNumber(longestRegex);
316+
numbers.add(builder.build());
317+
IncomingPhoneNumbersDao numDao = Mockito.mock(IncomingPhoneNumbersDao.class);
318+
when(numDao.getTotalIncomingPhoneNumbers((IncomingPhoneNumberFilter) any())).
319+
thenReturn(1,1);
320+
when(numDao.getIncomingPhoneNumbersByFilter((IncomingPhoneNumberFilter) any())).
321+
thenReturn(emptyNumbers, emptyNumbers);
322+
when(numDao.getIncomingPhoneNumbersRegex((IncomingPhoneNumberFilter) any())).
323+
thenReturn(numbers);
324+
InOrder inOrder = inOrder(numDao);
325+
NumberSelectorService service = new NumberSelectorService(numDao);
326+
327+
IncomingPhoneNumber found = service.searchNumber("1234", srcSid, destSid);
328+
329+
Assert.assertNotNull(found);
330+
Assert.assertEquals(longestRegex, found.getPhoneNumber());
331+
inOrder.verify(numDao, times(2)).getIncomingPhoneNumbersByFilter((IncomingPhoneNumberFilter) any());
332+
inOrder.verify(numDao, times(1)).getIncomingPhoneNumbersRegex((IncomingPhoneNumberFilter) any());
333+
}
334+
335+
@Test
336+
public void testRegexFailToMatchBecauseOfPhone() {
337+
Sid srcSid = null;
338+
Sid destSid = Sid.generate(Sid.Type.ORGANIZATION);
339+
String regex = "12.*";
340+
String longestRegex = "123.*";
341+
List<IncomingPhoneNumber> emptyNumbers = new ArrayList();
342+
List<IncomingPhoneNumber> numbers = new ArrayList();
343+
final IncomingPhoneNumber.Builder builder = IncomingPhoneNumber.builder();
344+
builder.setPhoneNumber(regex);
345+
numbers.add(builder.build());
346+
builder.setPhoneNumber(longestRegex);
347+
numbers.add(builder.build());
348+
IncomingPhoneNumbersDao numDao = Mockito.mock(IncomingPhoneNumbersDao.class);
349+
when(numDao.getTotalIncomingPhoneNumbers((IncomingPhoneNumberFilter) any())).
350+
thenReturn(1,1);
351+
when(numDao.getIncomingPhoneNumbersByFilter((IncomingPhoneNumberFilter) any())).
352+
thenReturn(emptyNumbers, emptyNumbers);
353+
when(numDao.getIncomingPhoneNumbersRegex((IncomingPhoneNumberFilter) any())).
354+
thenReturn(numbers);
355+
InOrder inOrder = inOrder(numDao);
356+
NumberSelectorService service = new NumberSelectorService(numDao);
357+
358+
IncomingPhoneNumber found = service.searchNumber("7788", srcSid, destSid);
359+
360+
Assert.assertNull(found);
361+
inOrder.verify(numDao, times(4)).getIncomingPhoneNumbersByFilter((IncomingPhoneNumberFilter) any());
362+
inOrder.verify(numDao, never()).getIncomingPhoneNumbersRegex((IncomingPhoneNumberFilter) any());
363+
}
364+
365+
366+
@Test
367+
public void testRegexFailToMatchBecauseDestOrgNull() {
368+
Sid srcSid = Sid.generate(Sid.Type.ORGANIZATION);
369+
Sid destSid = null;
370+
String regex = "12.*";
371+
String longestRegex = "123.*";
372+
List<IncomingPhoneNumber> emptyNumbers = new ArrayList();
373+
List<IncomingPhoneNumber> numbers = new ArrayList();
374+
final IncomingPhoneNumber.Builder builder = IncomingPhoneNumber.builder();
375+
builder.setPhoneNumber(regex);
376+
numbers.add(builder.build());
377+
builder.setPhoneNumber(longestRegex);
378+
numbers.add(builder.build());
379+
IncomingPhoneNumbersDao numDao = Mockito.mock(IncomingPhoneNumbersDao.class);
380+
when(numDao.getTotalIncomingPhoneNumbers((IncomingPhoneNumberFilter) any())).
381+
thenReturn(1,1);
382+
when(numDao.getIncomingPhoneNumbersByFilter((IncomingPhoneNumberFilter) any())).
383+
thenReturn(emptyNumbers, emptyNumbers);
384+
when(numDao.getIncomingPhoneNumbersRegex((IncomingPhoneNumberFilter) any())).
385+
thenReturn(numbers);
386+
InOrder inOrder = inOrder(numDao);
387+
NumberSelectorService service = new NumberSelectorService(numDao);
388+
389+
IncomingPhoneNumber found = service.searchNumber("1234", srcSid, destSid);
390+
391+
Assert.assertNull(found);
392+
inOrder.verify(numDao, times(2)).getIncomingPhoneNumbersByFilter((IncomingPhoneNumberFilter) any());
393+
inOrder.verify(numDao, never()).getIncomingPhoneNumbersRegex((IncomingPhoneNumberFilter) any());
394+
}
304395
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
3+
4+
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
5+
<appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
6+
<!--keep logs under maven target dir for git ginore and cleaning -->
7+
<!--use arquillian system property to make file names unique across forks -->
8+
<param name="file" value="target/logs/sip-server${arquillian_sip_port}.log" />
9+
<param name="MaxFileSize" value="20000KB" />
10+
<!-- Keep one backup file -->
11+
<param name="MaxBackupIndex" value="20" />
12+
<param name="append" value="false"/>
13+
<layout class="org.apache.log4j.PatternLayout">
14+
<param name="ConversionPattern" value="%p %t %l - %m%n" />
15+
</layout>
16+
</appender>
17+
<appender name="console" class="org.apache.log4j.ConsoleAppender">
18+
<param name="Target" value="System.out" />
19+
<layout class="org.apache.log4j.PatternLayout">
20+
<param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %p %t %l - %m%n" />
21+
</layout>
22+
</appender>
23+
<logger name="org.mobicents.servlet.sip.annotations">
24+
<level value="INFO" />
25+
</logger>
26+
<root>
27+
<priority value="DEBUG" />
28+
<appender-ref ref="console" />
29+
<appender-ref ref="rolling-file" />
30+
</root>
31+
</log4j:configuration>

restcomm/restcomm.telephony/src/main/java/org/restcomm/connect/telephony/ua/UserAgentManager.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import static javax.servlet.sip.SipServletResponse.SC_OK;
2525
import static javax.servlet.sip.SipServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED;
2626
import static javax.servlet.sip.SipServletResponse.SC_UNAUTHORIZED;
27+
import static javax.servlet.sip.SipServletResponse.SC_BUSY_EVERYWHERE;
28+
import static javax.servlet.sip.SipServletResponse.SC_BUSY_HERE;
2729
import static org.restcomm.connect.commons.util.HexadecimalUtils.toHex;
2830

2931
import java.io.IOException;
@@ -311,7 +313,11 @@ public void onReceive(final Object message) throws Exception {
311313
}
312314
} else if (message instanceof SipServletResponse) {
313315
SipServletResponse response = (SipServletResponse) message;
314-
if (response.getStatus()>400 && response.getMethod().equalsIgnoreCase("OPTIONS")) {
316+
int responseStatusCode = response.getStatus();
317+
if (responseStatusCode > 400
318+
// https://telestax.atlassian.net/browse/RESTCOMM-1582: Fix for User Agent that reply with BUSY when they are in a call
319+
&& (responseStatusCode != SC_BUSY_HERE && responseStatusCode != SC_BUSY_EVERYWHERE)
320+
&& response.getMethod().equalsIgnoreCase("OPTIONS")) {
315321
removeRegistration(response);
316322
} else if (actAsImsUa && response.getMethod().equalsIgnoreCase(REGISTER)) {
317323
proxyResponseFromIms(message, response);

0 commit comments

Comments
 (0)