+
+ Comparator<NeutronNetwork> neutronNetworkComparator = new Comparator<NeutronNetwork>() {
+ @Override
+ public int compare(NeutronNetwork o1, NeutronNetwork o2) {
+ return o1.getID().compareTo(o2.getID());
+ }
+ };
+
+ Collections.sort(ans, neutronNetworkComparator);
+
+ if (limit != null && ans.size() > 1) {
+ List<NeutronPageLink> links = new ArrayList<>();
+ Integer startPos = null;
+ String startMarker;
+ String endMarker;
+ Boolean firstPage = false;
+ Boolean lastPage = false;
+
+ if (marker == null) {
+ startPos = 0;
+ }
+
+ else {
+
+ NeutronNetwork markerNetwork = new NeutronNetwork();
+ markerNetwork.setNetworkUUID(marker);
+
+ startPos = Collections.binarySearch(ans, markerNetwork, neutronNetworkComparator);
+
+ if (!pageReverse){
+ startPos = startPos + 1;
+ }
+ else {
+ startPos = startPos - limit;
+ }
+
+ }
+
+ if (startPos == null) {
+ throw new ResourceNotFoundException("UUID for marker:" + marker + " could not be found");
+ }
+
+ if (startPos == 0){
+ firstPage = true;
+ }
+
+ if (startPos + limit >= ans.size()) {
+ ans = ans.subList(startPos, ans.size());
+ startMarker = ans.get(0).getID();
+ endMarker = ans.get(ans.size() - 1).getID();
+ lastPage = true;
+ }
+ else if (startPos < 0) {
+ if (startPos + limit > 0) {
+ ans = ans.subList(0, startPos + limit);
+ startMarker = ans.get(0).getID();
+ endMarker = ans.get(ans.size() - 1).getID();
+ firstPage = true;
+ }
+ else {
+ throw new BadRequestException("Requested page is out of bounds. Please check the supplied limit and marker");
+ }
+ }
+ else {
+ ans = ans.subList(startPos, startPos + limit);
+ startMarker = ans.get(0).getID();
+ endMarker = ans.get(limit-1).getID();
+ }
+
+ if (!lastPage) {
+ NeutronPageLink next = new NeutronPageLink();
+ next.setRef("next");
+ next.setHref(uriInfo.getAbsolutePath().toString() + "?limit=" + limit.toString() + "&marker=" + endMarker);
+ links.add(next);
+ }
+
+ if (!firstPage) {
+ NeutronPageLink previous = new NeutronPageLink();
+ previous.setRef("previous");
+ previous.setHref(uriInfo.getAbsolutePath().toString() + "?limit=" + limit.toString() + "&marker=" + startMarker + "&page_reverse=True");
+ links.add(previous);
+ }
+
+ return Response.status(200).entity(new PaginatedNeutronNetworkRequest(ans, links)).build();
+ }
+
+ return Response.status(200).entity(new NeutronNetworkRequest(ans)).build();
+