# 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.
#
# Signatures of APIs to avoid.
# Cribbed from Elasticsearch and Apache Calcite

java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars
java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars

#@defaultMessage Only use wait / notify when really needed. Try to use concurrency primitives, latches or callbacks instead.
#java.lang.Object#wait()
#java.lang.Object#wait(long)
#java.lang.Object#wait(long,int)
#java.lang.Object#notify()
#java.lang.Object#notifyAll()

#@defaultMessage Use StringBuilder; it is more efficient
#java.lang.StringBuffer

@defaultMessage Please do not try to stop the world
java.lang.System#gc()

#@defaultMessage Please do not try to kill the world
#java.lang.System#exit(int)
#java.lang.Runtime#exit(int)

@defaultMessage Don't interrupt threads use FutureUtils#cancel(Future<T>) instead
java.util.concurrent.Future#cancel(boolean)

@defaultMessage Spawning processes is a potential security issue
java.lang.ProcessBuilder
java.lang.Runtime#exec(java.lang.String)
java.lang.Runtime#exec(java.lang.String[])
java.lang.Runtime#exec(java.lang.String, java.lang.String[])
java.lang.Runtime#exec(java.lang.String, java.lang.String[], java.io.File)
java.lang.Runtime#exec(java.lang.String[], java.lang.String[])
java.lang.Runtime#exec(java.lang.String[], java.lang.String[], java.io.File)

#@defaultMessage For an enum, use == rather than equals
#java.lang.Enum#equals(java.lang.Object)

# Preconditions.checkArgument,
# Preconditions.checkPositionIndex, and
# Preconditions.checkState are still OK
#@defaultMessage Use Objects.requireNonNull
#com.google.common.base.Preconditions#checkNotNull(java.lang.Object)
#com.google.common.base.Preconditions#checkNotNull(java.lang.Object, java.lang.Object)

@defaultMessage Use java.util.Objects.equals
com.google.common.base.Objects#equal(java.lang.Object, java.lang.Object)

#@defaultMessage Use java.util.Objects
#com.google.common.base.Objects

@defaultMessage Use java.lang.String.join
com.google.common.base.Joiner

# Remove Guava calls to construct empty collections;
# Sets.identityHashSet(),
# Sets.newHashSet(Iterable) are still OK

#@defaultMessage Use "new ArrayList<>()"
#com.google.common.collect.Lists#newArrayList()

@defaultMessage Use "new HashMap<>()"
com.google.common.collect.Maps#newHashMap()

@defaultMessage Use "new IdentityHashMap<>()"
com.google.common.collect.Maps#newIdentityHashMap()

@defaultMessage Use "new TreeMap<>()"
com.google.common.collect.Maps#newTreeMap()

@defaultMessage Use "new HashSet<>()"
com.google.common.collect.Sets#newHashSet()

@defaultMessage Fix the truststore instead of working around
org.apache.http.conn.ssl.TrustSelfSignedStrategy
