diff --git a/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/applications.xml b/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/applications.xml index 9ed3309469..e4ddd01c75 100644 --- a/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/applications.xml +++ b/restcomm/restcomm.application/src/main/webapp/WEB-INF/scripts/mariadb/sql/applications.xml @@ -10,7 +10,7 @@ VALUES (#{sid}, #{date_created}, #{date_updated}, #{friendly_name}, #{account_sid}, #{api_version}, #{voice_caller_id_lookup}, #{uri}, #{rcml_url}, #{kind}); - + @@ -18,7 +18,7 @@ - + @@ -44,18 +44,50 @@ WHERE (app.account_sid=#{account_sid} or app.account_sid is null) ORDER BY app.date_created, app.sid; - + + + + + DELETE FROM restcomm_applications WHERE sid=#{sid}; - + DELETE FROM restcomm_applications WHERE account_sid=#{account_sid}; - + - UPDATE restcomm_applications SET friendly_name=#{friendly_name}, date_updated=#{date_updated}, - voice_caller_id_lookup=#{voice_caller_id_lookup}, rcml_url=#{rcml_url}, kind=#{kind} + UPDATE restcomm_applications SET friendly_name=#{friendly_name}, date_updated=#{date_updated}, + voice_caller_id_lookup=#{voice_caller_id_lookup}, rcml_url=#{rcml_url}, kind=#{kind} WHERE sid=#{sid}; diff --git a/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/applications.xml b/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/applications.xml index 81206d8acc..3def2546a0 100644 --- a/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/applications.xml +++ b/restcomm/restcomm.application/src/main/webapp/WEB-INF/sql/applications.xml @@ -65,6 +65,37 @@ ORDER BY "app"."date_created", "app"."sid"; + + + DELETE FROM "restcomm_applications" WHERE "sid"=#{sid}; @@ -79,4 +110,4 @@ "voice_caller_id_lookup"=#{voice_caller_id_lookup}, "rcml_url"=#{rcml_url}, "kind"=#{kind} WHERE "sid"=#{sid}; - \ No newline at end of file + diff --git a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/ApplicationsDao.java b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/ApplicationsDao.java index 7cfd20806e..1703a02c0d 100644 --- a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/ApplicationsDao.java +++ b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/ApplicationsDao.java @@ -23,25 +23,30 @@ import org.restcomm.connect.commons.dao.Sid; import org.restcomm.connect.dao.entities.Application; +import org.restcomm.connect.dao.entities.ApplicationFilter; /** * @author quintana.thomas@gmail.com (Thomas Quintana) */ public interface ApplicationsDao { - void addApplication(Application application); + void addApplication ( Application application ); - Application getApplication(Sid sid); + Application getApplication ( Sid sid ); - Application getApplication(String friendlyName); + Application getApplication ( String friendlyName ); - List getApplications(Sid accountSid); + List getApplications ( Sid accountSid ); + + List getApplications ( ApplicationFilter filter ); // this may optionally return related numbers as part of an Application - List getApplicationsWithNumbers(Sid accountSid); + List getApplicationsWithNumbers ( Sid accountSid ); + + List getApplicationsWithNumbers ( ApplicationFilter filter ); - void removeApplication(Sid sid); + void removeApplication ( Sid sid ); - void removeApplications(Sid accountSid); + void removeApplications ( Sid accountSid ); - void updateApplication(Application application); + void updateApplication ( Application application ); } diff --git a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/ApplicationFilter.java b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/ApplicationFilter.java new file mode 100644 index 0000000000..afe1666695 --- /dev/null +++ b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/entities/ApplicationFilter.java @@ -0,0 +1,45 @@ +/* + * TeleStax, Open Source Cloud Communications + * Copyright 2011-2014, 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 + * + */ +package org.restcomm.connect.dao.entities; + +import org.restcomm.connect.commons.annotations.concurrency.Immutable; + +@Immutable +public class ApplicationFilter { + private final String accountSid; + private final String friendlyName; + + public ApplicationFilter ( String accountSid, String friendlyName ) { + this.accountSid = accountSid; + this.friendlyName = friendlyName; + } + + public String getAccountSid ( ) { + return accountSid; + } + + /** + * @return the friendlyName + */ + public String getFriendlyName ( ) { + return friendlyName; + } + +} diff --git a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisApplicationsDao.java b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisApplicationsDao.java index 557288b65e..65911291f2 100644 --- a/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisApplicationsDao.java +++ b/restcomm/restcomm.dao/src/main/java/org/restcomm/connect/dao/mybatis/MybatisApplicationsDao.java @@ -25,6 +25,7 @@ import org.restcomm.connect.commons.annotations.concurrency.ThreadSafe; import org.restcomm.connect.dao.ApplicationsDao; import org.restcomm.connect.dao.entities.Application; +import org.restcomm.connect.dao.entities.ApplicationFilter; import org.restcomm.connect.commons.dao.Sid; import org.restcomm.connect.dao.entities.ApplicationNumberSummary; @@ -124,6 +125,36 @@ public List getApplicationsWithNumbers(Sid accountSid) { } } + @Override + public List getApplicationsWithNumbers (ApplicationFilter filter) { + final SqlSession session = sessions.openSession(); + try { + final List> results = session.selectList(namespace + "getApplicationsAndNumbersUsingFilters", filter); + final List applications = new ArrayList(); + if (results != null && !results.isEmpty()) { + Application previousApp = null; + Application app = null; + for (final Map result : results) { + app = toApplication(result); + if (previousApp != null && previousApp.getSid().equals(app.getSid()) ) + app = previousApp; + // if there is a number bound to this application populate the latter with the number details + if (result.get("num_sid") != null) { + populateApplicationWithNumber(app, result, "num_"); + } + if (previousApp == null || !previousApp.getSid().equals(app.getSid())) { + // is this is a new application in the result map add it to the list. Remember, the same app can be returned many times if it's related to many numbers + applications.add(app); + } + previousApp = app; + } + } + return applications; + } finally { + session.close(); + } + } + @Override public List getApplications(final Sid accountSid) { final SqlSession session = sessions.openSession(); @@ -141,6 +172,24 @@ public List getApplications(final Sid accountSid) { } } + // Issue 2615 + @Override + public List getApplications(ApplicationFilter filter) { + final SqlSession session = sessions.openSession(); + try { + final List> results = session.selectList(namespace + "getApplicationsUsingFilters", filter); + final List applications = new ArrayList(); + if (results != null && !results.isEmpty()) { + for (final Map result : results) { + applications.add(toApplication(result)); + } + } + return applications; + } finally { + session.close(); + } + } + @Override public void removeApplication(final Sid sid) { removeApplications("removeApplication", sid); diff --git a/restcomm/restcomm.dao/src/test/resources/applications.xml b/restcomm/restcomm.dao/src/test/resources/applications.xml index 81206d8acc..3def2546a0 100644 --- a/restcomm/restcomm.dao/src/test/resources/applications.xml +++ b/restcomm/restcomm.dao/src/test/resources/applications.xml @@ -65,6 +65,37 @@ ORDER BY "app"."date_created", "app"."sid"; + + + DELETE FROM "restcomm_applications" WHERE "sid"=#{sid}; @@ -79,4 +110,4 @@ "voice_caller_id_lookup"=#{voice_caller_id_lookup}, "rcml_url"=#{rcml_url}, "kind"=#{kind} WHERE "sid"=#{sid}; - \ No newline at end of file + diff --git a/restcomm/restcomm.dao/src/test/resources/applicationsDao/applications.xml b/restcomm/restcomm.dao/src/test/resources/applicationsDao/applications.xml index 6f3b323d2b..ab82410bb2 100644 --- a/restcomm/restcomm.dao/src/test/resources/applicationsDao/applications.xml +++ b/restcomm/restcomm.dao/src/test/resources/applicationsDao/applications.xml @@ -65,6 +65,37 @@ ORDER BY "app"."date_created", "app"."sid"; + + + DELETE FROM "restcomm_applications" WHERE "sid"=#{sid}; @@ -79,4 +110,4 @@ "voice_caller_id_lookup"=#{voice_caller_id_lookup}, "rcml_url"=#{rcml_url}, "kind"=#{kind} WHERE "sid"=#{sid}; - \ No newline at end of file + diff --git a/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/ApplicationsEndpoint.java b/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/ApplicationsEndpoint.java index 2bf7302251..22e457f8bb 100644 --- a/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/ApplicationsEndpoint.java +++ b/restcomm/restcomm.http/src/main/java/org/restcomm/connect/http/ApplicationsEndpoint.java @@ -25,6 +25,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.thoughtworks.xstream.XStream; + import org.apache.commons.configuration.Configuration; import org.restcomm.connect.commons.annotations.concurrency.NotThreadSafe; import org.restcomm.connect.commons.dao.Sid; @@ -33,6 +34,7 @@ import org.restcomm.connect.dao.DaoManager; import org.restcomm.connect.dao.entities.Account; import org.restcomm.connect.dao.entities.Application; +import org.restcomm.connect.dao.entities.ApplicationFilter; import org.restcomm.connect.dao.entities.ApplicationList; import org.restcomm.connect.dao.entities.ApplicationNumberSummary; import org.restcomm.connect.dao.entities.RestCommResponse; @@ -155,13 +157,18 @@ protected Response getApplications(final String accountSid, final MediaType resp Account account; account = accountsDao.getAccount(accountSid); secure(account, "RestComm:Read:Applications", SecuredType.SECURED_APP); + // shall we also return number information with the application ? boolean includeNumbers = false; String tmp = uriInfo.getQueryParameters().getFirst("includeNumbers"); if (tmp != null && tmp.equalsIgnoreCase("true")) includeNumbers = true; - final List applications = dao.getApplicationsWithNumbers(account.getSid()); + String friendlyName = uriInfo.getQueryParameters().getFirst("FriendlyName"); + + ApplicationFilter filter = new ApplicationFilter(account.getSid().toString(), friendlyName); + + final List applications = dao.getApplicationsWithNumbers(filter); if (APPLICATION_XML_TYPE == responseType) { final RestCommResponse response = new RestCommResponse(new ApplicationList(applications)); return ok(xstream.toXML(response), APPLICATION_XML).build(); diff --git a/restcomm/restcomm.mrb/src/test/resources/mappers/applications.xml b/restcomm/restcomm.mrb/src/test/resources/mappers/applications.xml index 81206d8acc..3def2546a0 100644 --- a/restcomm/restcomm.mrb/src/test/resources/mappers/applications.xml +++ b/restcomm/restcomm.mrb/src/test/resources/mappers/applications.xml @@ -65,6 +65,37 @@ ORDER BY "app"."date_created", "app"."sid"; + + + DELETE FROM "restcomm_applications" WHERE "sid"=#{sid}; @@ -79,4 +110,4 @@ "voice_caller_id_lookup"=#{voice_caller_id_lookup}, "rcml_url"=#{rcml_url}, "kind"=#{kind} WHERE "sid"=#{sid}; - \ No newline at end of file +