diff --git a/dao/src/main/java/org/n52/series/db/da/DatasetRepository.java b/dao/src/main/java/org/n52/series/db/da/DatasetRepository.java index 9e329dcc..03f725fb 100644 --- a/dao/src/main/java/org/n52/series/db/da/DatasetRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/DatasetRepository.java @@ -139,7 +139,8 @@ private void addCondensedResults(DatasetDao dao, List results, Session session) throws DataAccessException { - for (DatasetEntity series : dao.getAllInstances(query)) { + Iterable entities = addServiceFilter(dao.getAllInstances(query), query); + for (DatasetEntity series : entities) { results.add(createCondensed(series, query, session)); } } @@ -212,7 +213,8 @@ private void addExpandedResults(DatasetDao< ? extends DatasetEntity> dao, List results, Session session) throws DataAccessException { - for (DatasetEntity series : dao.getAllInstances(query)) { + Iterable entities = addServiceFilter(dao.getAllInstances(query), query); + for (DatasetEntity series : entities) { results.add(createExpanded(series, query, session)); } } diff --git a/dao/src/main/java/org/n52/series/db/da/GeometriesRepository.java b/dao/src/main/java/org/n52/series/db/da/GeometriesRepository.java index 5873962e..dd74e15f 100644 --- a/dao/src/main/java/org/n52/series/db/da/GeometriesRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/GeometriesRepository.java @@ -336,7 +336,6 @@ private PlatformOutput getPlatfom(FeatureEntity entity, DbQuery parameters) thro String.valueOf(entity.getPkid())) .extendWith(Parameters.FILTER_PLATFORM_TYPES, "all")); - List platforms = platformRepository.getAllCondensed(platformQuery); return platforms.iterator() .next(); diff --git a/dao/src/main/java/org/n52/series/db/da/HierarchicalParameterRepository.java b/dao/src/main/java/org/n52/series/db/da/HierarchicalParameterRepository.java index a346a832..a6d64439 100644 --- a/dao/src/main/java/org/n52/series/db/da/HierarchicalParameterRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/HierarchicalParameterRepository.java @@ -46,7 +46,8 @@ public abstract class HierarchicalParameterRepository createExpanded(Iterable entities, DbQuery query, Session session) throws DataAccessException { Set results = new HashSet<>(); - if (entities != null) { + if (entities != null && entities.iterator().hasNext()) { + addServiceFilter(entities, query); for (E entity : entities) { O result = createExpanded(entity, query, session); results.add(result); @@ -58,7 +59,8 @@ protected List createExpanded(Iterable entities, DbQuery query, Session se @Override protected List createCondensed(Iterable entities, DbQuery query, Session session) { Set results = new HashSet<>(); - if (entities != null) { + if (entities != null && entities.iterator().hasNext()) { + addServiceFilter(entities, query); for (E entity : entities) { O result = createCondensed(entity, query, session); results.add(result); diff --git a/dao/src/main/java/org/n52/series/db/da/ParameterRepository.java b/dao/src/main/java/org/n52/series/db/da/ParameterRepository.java index 514093dd..6aea916c 100644 --- a/dao/src/main/java/org/n52/series/db/da/ParameterRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/ParameterRepository.java @@ -88,7 +88,14 @@ public List getAllCondensed(DbQuery query, Session session) throws DataAccess protected List createCondensed(Iterable allInstances, DbQuery query, Session session) { List results = new ArrayList<>(); - for (E entity : allInstances) { + Iterable entities = addServiceFilter(allInstances, query); + for (E entity : entities) { + /* + * there are cases where entity does not match a filter + * which could not be added to a db criteria, e.g. spatial + * filters on mobile platforms (last location is calculated + * after db query has been finished already) + */ results.add(createCondensed(entity, query, session)); } return results; @@ -131,11 +138,12 @@ public List getAllExpanded(DbQuery query, Session session) throws DataAccessE protected List createExpanded(Iterable allInstances, DbQuery query, Session session) throws DataAccessException { List results = new ArrayList<>(); - for (E entity : allInstances) { + Iterable entities = addServiceFilter(allInstances, query); + for (E entity : entities) { O instance = createExpanded(entity, query, session); if (instance != null) { /* - * there are cases where entities does not match a filter + * there are cases where entity does not match a filter * which could not be added to a db criteria, e.g. spatial * filters on mobile platforms (last location is calculated * after db query has been finished already) diff --git a/dao/src/main/java/org/n52/series/db/da/PlatformRepository.java b/dao/src/main/java/org/n52/series/db/da/PlatformRepository.java index 5f5a7ff0..2250d5ed 100644 --- a/dao/src/main/java/org/n52/series/db/da/PlatformRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/PlatformRepository.java @@ -153,9 +153,9 @@ public PlatformOutput getInstance(String id, DbQuery query, Session session) thr PlatformEntity getEntity(String id, DbQuery parameters, Session session) throws DataAccessException { if (PlatformType.isStationaryId(id)) { - return getStation(id, parameters, session); + return addServiceFilter(getStation(id, parameters, session), parameters); } else { - return getPlatform(id, parameters, session); + return addServiceFilter(getPlatform(id, parameters, session), parameters); } } @@ -266,10 +266,10 @@ protected List getAllInstances(DbQuery query, Session session) t List platforms = new ArrayList<>(); FilterResolver filterResolver = query.getFilterResolver(); if (filterResolver.shallIncludeStationaryPlatformTypes()) { - platforms.addAll(getAllStationary(query, session)); + platforms.addAll(addServiceFilter(getAllStationary(query, session), query)); } if (filterResolver.shallIncludeMobilePlatformTypes()) { - platforms.addAll(getAllMobile(query, session)); + platforms.addAll(addServiceFilter(getAllMobile(query, session), query)); } return platforms; } diff --git a/dao/src/main/java/org/n52/series/db/da/SessionAwareRepository.java b/dao/src/main/java/org/n52/series/db/da/SessionAwareRepository.java index ce058883..57194a2d 100644 --- a/dao/src/main/java/org/n52/series/db/da/SessionAwareRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/SessionAwareRepository.java @@ -32,6 +32,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Iterator; import org.hibernate.Session; import org.slf4j.Logger; @@ -301,4 +302,31 @@ private void assertServiceAvailable(DescribableEntity entity) throws IllegalStat } } + protected > V addServiceFilter(V allInstances, DbQuery query) { + Iterator iterator = allInstances.iterator(); + while (iterator.hasNext()) { + T element = (T) iterator.next(); + if (!query.getParameters().getServices().isEmpty() && + !query.getParameters() + .getServices() + .contains(Long.toString(getServiceEntity(element).getPkid()))) { + try { + iterator.remove(); + } catch (UnsupportedOperationException e) { + // dao returning immutable list does not want serviceFilter to be added + } + } + } + return allInstances; + } + + protected T addServiceFilter(T instance, DbQuery query) { + if (!query.getParameters().getServices().isEmpty() && + !query.getParameters().getServices() + .contains(Long.toString(getServiceEntity(instance).getPkid()))) { + return null; + } else { + return instance; + } + } } diff --git a/dao/src/main/java/org/n52/series/db/da/StationRepository.java b/dao/src/main/java/org/n52/series/db/da/StationRepository.java index d0ba1480..8ecdb5bf 100644 --- a/dao/src/main/java/org/n52/series/db/da/StationRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/StationRepository.java @@ -81,7 +81,7 @@ public Collection searchFor(IoParameters parameters) { try { FeatureDao stationDao = createDao(session); DbQuery query = addPointLocationOnlyRestriction(getDbQuery(parameters)); - List found = stationDao.find(query); + List found = addServiceFilter(stationDao.find(query), query); return convertToSearchResults(found, query); } finally { returnSession(session); @@ -142,7 +142,7 @@ public List getAllExpanded(DbQuery parameters, Session session) t private List getAllInstances(DbQuery parameters, Session session) throws DataAccessException { FeatureDao featureDao = createDao(session); - return featureDao.getAllInstances(addPointLocationOnlyRestriction(parameters)); + return addServiceFilter(featureDao.getAllInstances(addPointLocationOnlyRestriction(parameters)), parameters); } @Override @@ -167,13 +167,16 @@ public StationOutput getInstance(String id, DbQuery parameters, Session session) private FeatureEntity getFeatureEntity(String id, DbQuery parameters, Session session) throws DataAccessException, BadRequestException { DbQuery query = addPointLocationOnlyRestriction(parameters); - return createDao(session).getInstance(parseId(id), query); + return addServiceFilter(createDao(session).getInstance(parseId(id), query), parameters); } public StationOutput getCondensedInstance(String id, DbQuery parameters, Session session) throws DataAccessException { FeatureDao featureDao = createDao(session); - FeatureEntity result = featureDao.getInstance(parseId(id), getDbQuery(IoParameters.createDefaults())); + FeatureEntity result = addServiceFilter( + featureDao.getInstance(parseId(id), getDbQuery(IoParameters.createDefaults())), + parameters + ); return createCondensed(result, parameters); } diff --git a/dao/src/main/java/org/n52/series/db/da/TimeseriesRepository.java b/dao/src/main/java/org/n52/series/db/da/TimeseriesRepository.java index e229ff74..b031efe5 100644 --- a/dao/src/main/java/org/n52/series/db/da/TimeseriesRepository.java +++ b/dao/src/main/java/org/n52/series/db/da/TimeseriesRepository.java @@ -137,7 +137,8 @@ public List getAllCondensed(DbQuery query) throws Data public List getAllCondensed(DbQuery query, Session session) throws DataAccessException { List results = new ArrayList<>(); DatasetDao seriesDao = createDao(session); - for (QuantityDatasetEntity timeseries : seriesDao.getAllInstances(query)) { + Iterable entities = addServiceFilter(seriesDao.getAllInstances(query), query); + for (QuantityDatasetEntity timeseries : entities) { results.add(createCondensed(timeseries, query, session)); } return results; @@ -157,7 +158,8 @@ public List getAllExpanded(DbQuery query) throws DataA public List getAllExpanded(DbQuery query, Session session) throws DataAccessException { List results = new ArrayList<>(); DatasetDao seriesDao = createDao(session); - for (QuantityDatasetEntity timeseries : seriesDao.getAllInstances(query)) { + Iterable entities = addServiceFilter(seriesDao.getAllInstances(query), query); + for (QuantityDatasetEntity timeseries : entities) { results.add(createExpanded(timeseries, query, session)); } return results; @@ -174,14 +176,14 @@ public TimeseriesMetadataOutput getInstance(String timeseriesId, DbQuery dbQuery } @Override - public TimeseriesMetadataOutput getInstance(String timeseriesId, DbQuery dbQuery, Session session) + public TimeseriesMetadataOutput getInstance(String timeseriesId, DbQuery query, Session session) throws DataAccessException { DatasetDao seriesDao = createDao(session); - QuantityDatasetEntity result = seriesDao.getInstance(parseId(timeseriesId), dbQuery); + QuantityDatasetEntity result = addServiceFilter(seriesDao.getInstance(parseId(timeseriesId), query), query); if (result == null) { throw new ResourceNotFoundException("Resource with id '" + timeseriesId + "' could not be found."); } - return createExpanded(result, dbQuery, session); + return createExpanded(result, query, session); } protected TimeseriesMetadataOutput createExpanded(QuantityDatasetEntity series, DbQuery query, Session session)