public void restoreState(RestorableSupport rs, RestorableSupport.StateObject so) {
    Boolean b = rs.getStateValueAsBoolean(so, "drawInterior");
    if (b != null) this.setDrawInterior(b);

    b = rs.getStateValueAsBoolean(so, "drawOutline");
    if (b != null) this.setDrawOutline(b);

    b = rs.getStateValueAsBoolean(so, "enableAntialiasing");
    if (b != null) this.setEnableAntialiasing(b);

    RestorableSupport.StateObject mo = rs.getStateObject(so, "interiorMaterial");
    if (mo != null) this.setInteriorMaterial(this.getInteriorMaterial().restoreState(rs, mo));

    mo = rs.getStateObject(so, "outlineMaterial");
    if (mo != null) this.setOutlineMaterial(this.getOutlineMaterial().restoreState(rs, mo));

    Double d = rs.getStateValueAsDouble(so, "interiorOpacity");
    if (d != null) this.setInteriorOpacity(d);

    d = rs.getStateValueAsDouble(so, "outlineOpacity");
    if (d != null) this.setOutlineOpacity(d);

    d = rs.getStateValueAsDouble(so, "outlineWidth");
    if (d != null) this.setOutlineWidth(d);

    Integer i = rs.getStateValueAsInteger(so, "outlineStippleFactor");
    if (i != null) this.setOutlineStippleFactor(i);

    i = rs.getStateValueAsInteger(so, "outlineStipplePattern");
    if (i != null) this.setOutlineStipplePattern(i.shortValue());

    String s = rs.getStateValueAsString(so, "interiorImagePath");
    if (s != null) this.setInteriorImageSource(s);

    d = rs.getStateValueAsDouble(so, "interiorImageScale");
    if (d != null) this.setInteriorImageScale(d);
  }
  protected static void legacyWmsRestoreStateToParams(
      RestorableSupport rs, RestorableSupport.StateObject context, AVList params) {
    // WMSTiledImageLayer has historically used a different format for storing LatLon and Sector
    // properties
    // in the restorable state XML documents. Although WMSTiledImageLayer no longer writes these
    // properties,
    // we must provide support for reading them here.
    Double lat = rs.getStateValueAsDouble(context, AVKey.LEVEL_ZERO_TILE_DELTA + ".Latitude");
    Double lon = rs.getStateValueAsDouble(context, AVKey.LEVEL_ZERO_TILE_DELTA + ".Longitude");
    if (lat != null && lon != null)
      params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, LatLon.fromDegrees(lat, lon));

    Double minLat = rs.getStateValueAsDouble(context, AVKey.SECTOR + ".MinLatitude");
    Double minLon = rs.getStateValueAsDouble(context, AVKey.SECTOR + ".MinLongitude");
    Double maxLat = rs.getStateValueAsDouble(context, AVKey.SECTOR + ".MaxLatitude");
    Double maxLon = rs.getStateValueAsDouble(context, AVKey.SECTOR + ".MaxLongitude");
    if (minLat != null && minLon != null && maxLat != null && maxLon != null)
      params.setValue(AVKey.SECTOR, Sector.fromDegrees(minLat, maxLat, minLon, maxLon));
  }