private static boolean polygonToLine(
     Geometry geom, Class<? extends Geometry> targetType, Collection<Geometry> result) {
   if (geom instanceof Polygon && LineString.class == targetType) {
     Polygon polygon = (Polygon) geom;
     result.add(
         geomBuilder.safeCreateGeometry(
             LineString.class, polygon.getExteriorRing().getCoordinates()));
     int i = 0;
     while (i < polygon.getNumInteriorRing()) {
       result.add(
           geomBuilder.safeCreateGeometry(
               LineString.class, polygon.getInteriorRingN(i).getCoordinates()));
       i++;
     }
     return true;
   }
   return false;
 }
 private static boolean simpleToMultiPolygon(
     Geometry geom, Class<? extends Geometry> targetType, Collection<Geometry> result) {
   if (!(geom instanceof Polygon)
       && !(geom instanceof GeometryCollection)
       && MultiPolygon.class == targetType) {
     result.add(geomBuilder.safeCreateGeometry(targetType, geom.getCoordinates()));
     return true;
   }
   return false;
 }
 private static boolean collectionToMultiPolygon(
     Geometry geom, Class<? extends Geometry> targetType, Collection<Geometry> result) {
   if (!(geom instanceof Polygon)
       && geom instanceof GeometryCollection
       && MultiPolygon.class == targetType) {
     for (int i = 0; i < geom.getNumGeometries(); i++) {
       result.add(
           geomBuilder.safeCreateGeometry(targetType, geom.getGeometryN(i).getCoordinates()));
     }
     return true;
   }
   return false;
 }
 private static boolean collectionToMultiLine(
     Geometry geom, Class<? extends Geometry> targetType, Collection<Geometry> result) {
   if (!(geom instanceof Polygon)
       && !(geom instanceof MultiPolygon)
       && (geom instanceof GeometryCollection)
       && MultiLineString.class == targetType) {
     LineString[] geoms = new LineString[geom.getNumGeometries()];
     for (int i = 0; i < geom.getNumGeometries(); i++) {
       geoms[i] =
           geomBuilder.safeCreateGeometry(LineString.class, geom.getGeometryN(i).getCoordinates());
     }
     result.add(geomBuilder.factory.createMultiLineString(geoms));
     return true;
   }
   return false;
 }
  private static boolean toLinearRing(
      Geometry geom, Class<? extends Geometry> targetType, Collection<Geometry> result) {
    if (!(targetType == LinearRing.class)) return false;
    ArrayList<Geometry> tmp = new ArrayList<Geometry>();
    if (!simpleToLine(geom, LineString.class, tmp)) {
      if (!collectionToLine(geom, LineString.class, tmp)) {
        if (!polygonToLine(geom, LineString.class, tmp)) {
          if (!multiPolygonToLine(geom, LineString.class, tmp)) {
            return false;
          }
        }
      }
    }

    for (Geometry geometry : tmp) {
      result.add(geomBuilder.safeCreateGeometry(targetType, geometry.getCoordinates()));
    }
    return true;
  }