content: /*
   *  Copyright (C) 2010-2012 Stichting Akvo (Akvo Foundation)
   *
   *  This file is part of Akvo FLOW.
   *
   *  Akvo FLOW is free software: you can redistribute it and modify it under the terms of
   *  the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
   *  either version 3 of the License or any later version.
   *
   *  Akvo FLOW 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 included below for more details.
   *
   *  The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
   */
  
  package org.waterforpeople.mapping.dao;
  
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.net.URL;
  import java.util.Map;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  import com.vividsolutions.jts.geom.GeometryFactory;
  import com.vividsolutions.jts.geom.Polygon;
  import com.vividsolutions.jts.index.strtree.STRtree;
  import com.vividsolutions.jts.io.WKTReader;
  
  /**
   * This data access object will persist and retrieve Geo information from the GIS index. This
   * implementation uses JTS (see http://www.vividsolutions.com/jts/jtshome.htm).
   *
   * @author Christopher Fagiani
   */
  public class GeoIndexDao {
      private static final Logger log = Logger.getLogger(GeoIndexDao.class
              .getName());
  
      private static final String INDEX_BASE_URL = "http://dru-test.s3.amazonaws.com/gis/index/";
  
      /**
       * this will create (or replace) a geo index for each of the regions passed in.
       *
       * @param regions - map with regions uuid as key and POLYGON WellKnownFormat strings as values
       */
      public void saveRegionIndex(Map<String, String> regions) {
          GeometryFactory factory;
          STRtree index = new STRtree();
          try {
              for (String region : regions.keySet()) {
                  factory = new GeometryFactory();
                  WKTReader reader = new WKTReader(factory);
                  Polygon regionPolygon = (Polygon) reader.read(regions
                          .get(region));
  
                  index
                          .insert(regionPolygon.getEnvelopeInternal(),
                                  regionPolygon);
  
                  index.build();
  
                  ByteArrayOutputStream byteArr = new ByteArrayOutputStream();
                  ObjectOutputStream oos = new ObjectOutputStream(byteArr);
                  oos.writeObject(index);
                  oos.close();
              }
  
          } catch (Exception e) {
              log.log(Level.WARNING, "Could not upload index", e);
          }
      }
  
      /**
       * fetches a pre-generated index
       *
       * @param regionUUID
       * @return
       */
      public STRtree findGeoIndex(String regionUUID) {
          STRtree index = null;
          ObjectInputStream ois = null;
          try {
              URL url = new URL(INDEX_BASE_URL + regionUUID);
              ois = new ObjectInputStream(url.openStream());
              index = (STRtree) ois.readObject();
          } catch (Exception e) {
              log.log(Level.WARNING, "Could not download index", e);
          } finally {
              if (ois != null) {
                  try {
                      ois.close();
                  } catch (IOException e) {
                      // no-op
                  }
              }
          }
          return index;
      }
  }
  