<?xml version="1.0"?>

<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at
       http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<modernizer>
    <!-- Additional rules that augment the standard ones -->
    <!-- Method/constructor descriptors (used in 'name') can be obtained using 'javap -s'. -->

    <!-- Disallow String#getBytes() -->
    <violation>
        <name>java/lang/String.getBytes:()[B</name>
        <version>1.6</version>
        <comment>Prefer java.lang.String.getBytes(java.nio.charset.Charset)</comment>
    </violation>

    <!-- Disallow String(byte[], int, int) constructor -->
    <violation>
        <name>java/lang/String."&lt;init&gt;":([BII)V</name>
        <version>1.6</version>
        <comment>Prefer java.lang.String.&lt;init&gt;(byte[], int, int, java.nio.charset.Charset)</comment>
    </violation>

    <!-- Disallow String(byte[]) constructor -->
    <violation>
        <name>java/lang/String."&lt;init&gt;":([B)V</name>
        <version>1.6</version>
        <comment>Prefer java.lang.String.&lt;init&gt;(byte[], java.nio.charset.Charset)</comment>
    </violation>

    <!-- Disallow ByteArrayOutputStream#toString() -->
    <violation>
        <name>java/io/ByteArrayOutputStream.toString:()Ljava/lang/String;</name>
        <version>1.10</version>
        <comment>Prefer java.io.ByteArrayOutputStream.toString(java.nio.charset.Charset)</comment>
    </violation>
</modernizer>
