/**
   * _more_
   *
   * @param entry _more_
   * @param properties _more_
   * @return _more_
   * @throws Exception _more_
   */
  private RecordFile doMakeRecordFile(Entry entry, Hashtable properties) throws Exception {
    String recordFileClass = getProperty("record.file.class", (String) null);
    if (recordFileClass != null) {
      return doMakeRecordFile(entry, recordFileClass, properties);
    }
    String path = entry.getFile().toString();

    return (RecordFile) getRecordFileFactory().doMakeRecordFile(path, properties);
  }
  /**
   * _more_
   *
   * @param entry _more_
   * @param className _more_
   * @param properties _more_
   * @return _more_
   * @throws Exception _more_
   */
  private RecordFile doMakeRecordFile(Entry entry, String className, Hashtable properties)
      throws Exception {
    Class c = Misc.findClass(className);
    Constructor ctor = Misc.findConstructor(c, new Class[] {String.class, Hashtable.class});
    if (ctor != null) {
      return (RecordFile) ctor.newInstance(new Object[] {entry.getFile().toString(), properties});
    }
    ctor = Misc.findConstructor(c, new Class[] {String.class});

    if (ctor != null) {
      return (RecordFile) ctor.newInstance(new Object[] {entry.getResource().getPath()});
    }

    throw new IllegalArgumentException("Could not find constructor for " + className);
  }
  /**
   * @param request _more_
   * @param entry _more_
   * @param map _more_
   * @return _more_
   */
  @Override
  public boolean addToMap(Request request, Entry entry, MapInfo map) {
    try {
      if (!entry.isFile()) {
        return true;
      }
      // TODO: stream through the shapes
      EsriShapefile shapefile = new EsriShapefile(entry.getFile().toString());
      List features = shapefile.getFeatures();
      int totalPoints = 0;
      int MAX_POINTS = 10000;
      for (int i = 0; i < features.size(); i++) {
        if (totalPoints > MAX_POINTS) {
          break;
        }
        EsriShapefile.EsriFeature gf = (EsriShapefile.EsriFeature) features.get(i);
        java.util.Iterator pi = gf.getGisParts();
        while (pi.hasNext()) {
          if (totalPoints > MAX_POINTS) {
            break;
          }
          GisPart gp = (GisPart) pi.next();
          double[] xx = gp.getX();
          double[] yy = gp.getY();
          List<double[]> points = new ArrayList<double[]>();
          for (int ptIdx = 0; ptIdx < xx.length; ptIdx++) {
            points.add(new double[] {yy[ptIdx], xx[ptIdx]});
          }
          totalPoints += points.size();
          if (points.size() > 1) {
            map.addLines("", points);
          } else if (points.size() == 1) {
            map.addMarker("id", points.get(0)[0], points.get(0)[1], null, "");
          }
        }
      }
    } catch (Exception exc) {
      throw new RuntimeException(exc);
    }

    return false;
  }
 /**
  * _more_
  *
  * @param request _more_
  * @param entry _more_
  * @param parent _more_
  * @param newEntry _more_
  * @throws Exception _more_
  */
 public void initializeEntryFromForm(Request request, Entry entry, Entry parent, boolean newEntry)
     throws Exception {
   if (!entry.isFile()) {
     return;
   }
   EsriShapefile shapefile = new EsriShapefile(entry.getFile().toString());
   Rectangle2D bounds = shapefile.getBoundingBox();
   double[][] lonlat = new double[][] {{bounds.getX()}, {bounds.getY() + bounds.getHeight()}};
   ProjFile projFile = shapefile.getProjFile();
   if (projFile != null) {
     lonlat = projFile.convertToLonLat(lonlat);
   }
   entry.setNorth(lonlat[IDX_LAT][0]);
   entry.setWest(lonlat[IDX_LON][0]);
   lonlat[IDX_LAT][0] = bounds.getY();
   lonlat[IDX_LON][0] = bounds.getX() + bounds.getWidth();
   if (projFile != null) {
     lonlat = projFile.convertToLonLat(lonlat);
   }
   entry.setSouth(lonlat[IDX_LAT][0]);
   entry.setEast(lonlat[IDX_LON][0]);
 }