/gazetteer/src/main/java/org/ala/rest/FeatureList.java

http://alageospatialportal.googlecode.com/ · Java · 157 lines · 123 code · 22 blank · 12 comment · 21 complexity · 6c69b5f2146baf7ee6f3ac0ea6ffb953 MD5 · raw file

  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */
  5. package org.ala.rest;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.logging.Logger;
  12. import javax.servlet.ServletContext;
  13. import org.geoserver.catalog.Catalog;
  14. import org.geoserver.catalog.LayerInfo;
  15. import org.geoserver.config.GeoServer;
  16. import org.geoserver.platform.GeoServerExtensions;
  17. import org.geotools.data.DataStore;
  18. import org.geotools.data.FeatureSource;
  19. import org.geotools.data.Query;
  20. import org.geotools.feature.FeatureIterator;
  21. import org.geotools.util.logging.Logging;
  22. import org.opengis.feature.Feature;
  23. import org.vfny.geoserver.util.DataStoreUtils;
  24. /**
  25. * Represents a list of features (as hyperlinks) for a given layer
  26. * @author angus
  27. */
  28. public class FeatureList {
  29. private static final Logger logger = Logging.getLogger("org.ala.rest.FeatureList");
  30. List<String> links = new ArrayList();
  31. private static int PAGE_SIZE = 100;
  32. private int total_features;
  33. private int page;
  34. private String layerName;
  35. private String layerAlias;
  36. private GazetteerConfig gc = new GazetteerConfig();
  37. private String format = "";
  38. public FeatureList(String layerName) throws IOException, Exception {
  39. this(layerName, 1);
  40. }
  41. public FeatureList(String layerName, int page) throws IOException, Exception {
  42. logger.finer("param: layerName: " + layerName);
  43. this.page = page;
  44. this.layerName = layerName;
  45. GeoServer gs = GeoServerExtensions.bean(GeoServer.class);
  46. ServletContext sc = GeoServerExtensions.bean(ServletContext.class);
  47. Catalog catalog = gs.getCatalog();
  48. //check to see if layer exists, if not check to see if alias exists ...
  49. if (!gc.layerNameExists(layerName)) {
  50. logger.finer("layer " + layerName + " does not exist - trying aliases.");
  51. layerName = gc.getNameFromAlias(layerName);
  52. if (layerName.compareTo("") == 0) {
  53. logger.finer("no aliases found for layer, giving up");
  54. return;
  55. }
  56. }
  57. if (gc.getLayerAlias(layerName).compareTo("") != 0){
  58. layerAlias = gc.getLayerAlias(layerName);
  59. }
  60. else{
  61. layerAlias = layerName;
  62. }
  63. LayerInfo layerInfo = catalog.getLayerByName(layerName);
  64. Map params = layerInfo.getResource().getStore().getConnectionParameters();
  65. DataStore dataStore = DataStoreUtils.acquireDataStore(params, sc);
  66. try {
  67. if (dataStore == null) {
  68. throw new Exception("Could not find datastore for this layer");
  69. } else {
  70. FeatureSource layer = dataStore.getFeatureSource(layerName);
  71. FeatureIterator features = layer.getFeatures().features(); //FIXME: this could be a lot faster if we didn't request the_geom?.
  72. //Feature[] features = (Feature[])layer.getFeatures().t;
  73. String idAttribute1Name = gc.getIdAttribute1Name(layerName);
  74. String idAttribute2Name = gc.getIdAttribute2Name(layerName);
  75. total_features = layer.getCount(Query.ALL);
  76. if (features.hasNext()) {
  77. int featureNumber = 0;
  78. logger.finer("PAGE: " + page);
  79. while (features.hasNext()) {
  80. Feature feature = features.next(); //TODO: Really dumb way to do paging - but FeatureSource doesn't seem to allow anything else
  81. if (featureNumber == PAGE_SIZE * (page)) {
  82. System.out.println("Finished page");
  83. break;
  84. }
  85. if (featureNumber >= PAGE_SIZE * (page - 1)) {
  86. String link = gc.getBaseURL() + "/" + layerAlias + "/" + feature.getProperty(idAttribute1Name).getValue().toString();
  87. if (idAttribute2Name.compareTo("") != 0) {
  88. link += "/" + feature.getProperty(idAttribute2Name).getValue().toString();
  89. }
  90. link += ".json";
  91. links.add(link.replace(" ", "_"));
  92. }
  93. featureNumber++;
  94. }
  95. } else {
  96. throw new Exception("Could not find feature");
  97. }
  98. features.close();
  99. }
  100. } finally {
  101. dataStore.dispose();
  102. }
  103. }
  104. public void setFormat(String format) {
  105. this.format = format;
  106. }
  107. public Map getMap() {
  108. Map map = new HashMap();
  109. map.put("features", this.links);
  110. if (total_features > page * PAGE_SIZE) {
  111. int nextPage = page + 1;
  112. String next = String.valueOf(nextPage);
  113. if (!format.isEmpty()) {
  114. next = String.valueOf(nextPage) + "." + format;
  115. }
  116. map.put("next", gc.getBaseURL() + "/" + layerAlias + "/features/" + next);
  117. }
  118. //Previous button (if applicable)
  119. if (page > 1) {
  120. int prevPage = page-1;
  121. String prev = String.valueOf(prevPage);
  122. if (!format.isEmpty()) {
  123. prev = String.valueOf(prev) + "." + format;
  124. }
  125. map.put("prev", gc.getBaseURL() + "/" + layerAlias + "/features/" + prev);
  126. }
  127. //List total number of pages
  128. int pages = total_features / PAGE_SIZE;
  129. if (total_features % PAGE_SIZE > 0) {
  130. pages++;
  131. }
  132. map.put("total_pages", pages);
  133. return map;
  134. }
  135. }