protected Polygon<?> createGeometry(SqlServerGeometry nativeGeom, int shapeIndex) {
   if (nativeGeom.isEmptyShape(shapeIndex)) {
     return (Polygon<?>) createNullGeometry(nativeGeom.getCoordinateReferenceSystem());
   }
   // polygons consist of one exterior ring figure, and several interior ones.
   IndexRange figureRange = nativeGeom.getFiguresForShape(shapeIndex);
   List<LinearRing<?>> rings = new ArrayList<LinearRing<?>>(figureRange.length());
   // the rings should contain all inner rings from index 1 to index length - 1
   // index = 0 should be reserved for the shell.
   for (int figureIdx = figureRange.start, i = 1; figureIdx < figureRange.end; figureIdx++) {
     IndexRange pntIndexRange = nativeGeom.getPointsForFigure(figureIdx);
     if (nativeGeom.isFigureInteriorRing(figureIdx)) {
       rings.set(i++, toLinearRing(nativeGeom, pntIndexRange));
     } else {
       rings.set(0, toLinearRing(nativeGeom, pntIndexRange));
     }
   }
   LinearRing<?>[] ringArr = (LinearRing<?>[]) new LinearRing[rings.size()];
   return new Polygon(rings.toArray(ringArr));
 }