From 31f0aca65d4955bc0d91063842d93bcb78d00bc6 Mon Sep 17 00:00:00 2001
From: Simon Willnauer
Date: Sat, 18 May 2013 23:49:04 +0200
Subject: [PATCH] Integrate forbiddenAPI checks into Maven build.
This commit integrates the forbiddenAPI checks that checks
Java byte code against a list of "forbidden" API signatures.
The commit also contains the fixes of the current source code
that didn't pass the default API checks.
See https://code.google.com/p/forbidden-apis/ for details.
Closes #3059
---
core-signatures.txt | 27 ++++++++
pom.xml | 62 +++++++++++++++++++
.../BroadcastOperationThreading.java | 4 +-
...portIndicesReplicationOperationAction.java | 1 -
.../elasticsearch/bootstrap/Bootstrap.java | 3 +-
.../cluster/block/ClusterBlock.java | 3 +-
.../metadata/MetaDataCreateIndexService.java | 10 ++-
.../MetaDataIndexTemplateService.java | 3 +-
.../MetaDataUpdateSettingsService.java | 3 +-
.../ClusterRebalanceAllocationDecider.java | 3 +-
.../routing/allocation/decider/Decision.java | 3 +-
.../java/org/elasticsearch/common/Base64.java | 11 ++--
.../java/org/elasticsearch/common/Names.java | 8 ++-
.../org/elasticsearch/common/StopWatch.java | 5 +-
.../org/elasticsearch/common/Strings.java | 8 +--
.../elasticsearch/common/inject/Scopes.java | 3 +-
.../common/inject/internal/Errors.java | 61 +++++++++---------
.../common/io/FastByteArrayOutputStream.java | 2 +-
.../org/elasticsearch/common/io/Streams.java | 7 ++-
.../org/elasticsearch/common/jna/Natives.java | 6 +-
.../common/lucene/LoggerInfoStream.java | 21 +++++--
.../elasticsearch/common/lucene/Lucene.java | 21 -------
.../function/FiltersFunctionScoreQuery.java | 5 +-
.../common/math/MathRuntimeException.java | 6 +-
.../common/network/NetworkService.java | 9 +--
.../org/elasticsearch/common/os/OsUtils.java | 12 ++--
.../common/settings/ImmutableSettings.java | 4 +-
.../common/util/BigLongArray.java | 6 +-
.../org/elasticsearch/env/Environment.java | 2 +-
.../org/elasticsearch/http/HttpServer.java | 3 +-
.../index/analysis/Analysis.java | 4 +-
.../analysis/HunspellTokenFilterFactory.java | 4 +-
.../index/engine/robin/RobinEngine.java | 2 +-
.../slowlog/ShardSlowLogIndexingService.java | 7 ++-
.../index/mapper/core/DateFieldMapper.java | 4 +-
.../index/mapper/geo/GeoPointFieldMapper.java | 3 +-
.../mapper/multifield/MultiFieldMapper.java | 3 +-
.../index/mapper/object/ObjectMapper.java | 6 +-
.../index/query/FieldQueryBuilder.java | 3 +-
.../index/query/GeoDistanceFilterBuilder.java | 3 +-
.../query/GeoDistanceRangeFilterBuilder.java | 3 +-
.../index/query/QueryStringQueryBuilder.java | 3 +-
.../elasticsearch/index/query/RegexpFlag.java | 4 +-
.../nested/NestedFieldComparatorSource.java | 3 +-
.../slowlog/ShardSlowLogSearchService.java | 7 ++-
.../shard/service/InternalIndexShard.java | 3 +-
.../indices/analysis/HunspellService.java | 13 ++--
.../monitor/dump/AbstractDump.java | 7 +--
.../dump/summary/SummaryDumpContributor.java | 3 +-
.../dump/thread/ThreadDumpContributor.java | 7 ++-
.../elasticsearch/monitor/jvm/HotThreads.java | 10 +--
.../health/RestClusterHealthAction.java | 9 +--
.../org/elasticsearch/river/RiverModule.java | 3 +-
.../elasticsearch/script/ScriptService.java | 2 +-
.../geodistance/GeoDistanceFacetBuilder.java | 3 +-
.../search/facet/terms/TermsFacetBuilder.java | 3 +-
.../termsstats/TermsStatsFacetBuilder.java | 3 +-
.../search/sort/GeoDistanceSortBuilder.java | 3 +-
.../integration/rest/helper/HttpClient.java | 4 +-
.../child/SimpleChildQuerySearchTests.java | 11 ++--
.../search/facet/ExtendedFacetsTests.java | 2 +-
.../search/suggest/SuggestSearchTests.java | 5 +-
.../validate/SimpleValidateQueryTests.java | 9 +--
.../unit/action/bulk/BulkRequestTests.java | 9 +--
.../test/unit/common/io/StreamsTests.java | 7 ++-
.../builder/XContentBuilderTests.java | 2 +-
.../index/analysis/AnalysisModuleTests.java | 5 +-
.../index/cache/id/SimpleIdCacheTests.java | 7 ++-
.../index/fielddata/DuellFieldDataTest.java | 17 ++---
.../unit/index/gateway/CommitPointsTests.java | 4 +-
.../mapper/simple/SimpleMapperTests.java | 3 +-
.../timestamp/TimestampMappingTests.java | 4 +-
.../phrase/NoisyChannelSpellCheckerTests.java | 7 ++-
73 files changed, 351 insertions(+), 195 deletions(-)
create mode 100644 core-signatures.txt
diff --git a/core-signatures.txt b/core-signatures.txt
new file mode 100644
index 00000000000..a502959bdaf
--- /dev/null
+++ b/core-signatures.txt
@@ -0,0 +1,27 @@
+# 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.
+
+# see Solr's DefaultSolrThreadFactory
+# see Lucene's NamedThreadFactory
+
+@defaultMessage spawns threads with vague names; use a custom thread factory and name threads so that you can tell (by its name) which executor it is associated with
+
+java.util.concurrent.Executors#newFixedThreadPool(int)
+java.util.concurrent.Executors#newSingleThreadExecutor()
+java.util.concurrent.Executors#newCachedThreadPool()
+java.util.concurrent.Executors#newSingleThreadScheduledExecutor()
+java.util.concurrent.Executors#newScheduledThreadPool(int)
+java.util.concurrent.Executors#defaultThreadFactory()
+java.util.concurrent.Executors#privilegedThreadFactory()
diff --git a/pom.xml b/pom.xml
index 507d4e82d5c..b4d7c404b42 100644
--- a/pom.xml
+++ b/pom.xml
@@ -792,6 +792,68 @@
+
+ de.thetaphi
+ forbiddenapis
+ 1.3
+
+
+
+ check-forbidden-apis
+
+ 1.6
+
+ true
+
+ false
+
+ jsr166e/**
+ jsr166y/**
+
+
+
+
+ jdk-unsafe
+ jdk-deprecated
+
+
+
+ core-signatures.txt
+
+
+ test
+
+ check
+
+
+
+ check-forbidden-test-apis
+
+ 1.6
+
+ true
+
+ false
+
+
+ jdk-unsafe
+ jdk-deprecated
+
+
+ test
+
+ testCheck
+
+
+
+
diff --git a/src/main/java/org/elasticsearch/action/support/broadcast/BroadcastOperationThreading.java b/src/main/java/org/elasticsearch/action/support/broadcast/BroadcastOperationThreading.java
index 45a66e42720..c1558cf8ee1 100644
--- a/src/main/java/org/elasticsearch/action/support/broadcast/BroadcastOperationThreading.java
+++ b/src/main/java/org/elasticsearch/action/support/broadcast/BroadcastOperationThreading.java
@@ -19,6 +19,8 @@
package org.elasticsearch.action.support.broadcast;
+import java.util.Locale;
+
import org.elasticsearch.ElasticSearchIllegalArgumentException;
/**
@@ -69,6 +71,6 @@ public enum BroadcastOperationThreading {
if (value == null) {
return defaultValue;
}
- return BroadcastOperationThreading.valueOf(value.toUpperCase());
+ return BroadcastOperationThreading.valueOf(value.toUpperCase(Locale.ROOT));
}
}
diff --git a/src/main/java/org/elasticsearch/action/support/replication/TransportIndicesReplicationOperationAction.java b/src/main/java/org/elasticsearch/action/support/replication/TransportIndicesReplicationOperationAction.java
index 64709fce0b6..0cd37211f95 100644
--- a/src/main/java/org/elasticsearch/action/support/replication/TransportIndicesReplicationOperationAction.java
+++ b/src/main/java/org/elasticsearch/action/support/replication/TransportIndicesReplicationOperationAction.java
@@ -108,7 +108,6 @@ public abstract class TransportIndicesReplicationOperationActionEncodes and decodes to and from Base64 notation.
@@ -907,7 +908,7 @@ public class Base64 {
if (off + len > source.length) {
throw new IllegalArgumentException(
- String.format("Cannot have offset of %d and length of %d with array of length %d", off, len, source.length));
+ String.format(Locale.ROOT, "Cannot have offset of %d and length of %d with array of length %d", off, len, source.length));
} // end if: off < 0
@@ -1050,11 +1051,11 @@ public class Base64 {
throw new NullPointerException("Destination array was null.");
} // end if
if (srcOffset < 0 || srcOffset + 3 >= source.length) {
- throw new IllegalArgumentException(String.format(
+ throw new IllegalArgumentException(String.format(Locale.ROOT,
"Source array with length %d cannot have offset of %d and still process four bytes.", source.length, srcOffset));
} // end if
if (destOffset < 0 || destOffset + 2 >= destination.length) {
- throw new IllegalArgumentException(String.format(
+ throw new IllegalArgumentException(String.format(Locale.ROOT,
"Destination array with length %d cannot have offset of %d and still store three bytes.", destination.length, destOffset));
} // end if
@@ -1160,7 +1161,7 @@ public class Base64 {
throw new NullPointerException("Cannot decode null source array.");
} // end if
if (off < 0 || off + len > source.length) {
- throw new IllegalArgumentException(String.format(
+ throw new IllegalArgumentException(String.format(Locale.ROOT,
"Source array with length %d cannot have offset of %d and process %d bytes.", source.length, off, len));
} // end if
@@ -1205,7 +1206,7 @@ public class Base64 {
} // end if: white space, equals sign or better
else {
// There's a bad input character in the Base64 stream.
- throw new java.io.IOException(String.format(
+ throw new java.io.IOException(String.format(Locale.ROOT,
"Bad Base64 input character decimal %d in array position %d", ((int) source[i]) & 0xFF, i));
} // end else:
} // each input character
diff --git a/src/main/java/org/elasticsearch/common/Names.java b/src/main/java/org/elasticsearch/common/Names.java
index 7753424cda8..994db851d7f 100644
--- a/src/main/java/org/elasticsearch/common/Names.java
+++ b/src/main/java/org/elasticsearch/common/Names.java
@@ -28,6 +28,8 @@ import java.io.InputStreamReader;
import java.net.URL;
import java.util.Random;
+import org.elasticsearch.common.io.Streams;
+
/**
*
*/
@@ -36,13 +38,13 @@ public abstract class Names {
public static String randomNodeName(URL nodeNames) {
BufferedReader reader = null;
try {
- reader = new BufferedReader(new InputStreamReader(nodeNames.openStream()));
+ reader = new BufferedReader(new InputStreamReader(nodeNames.openStream(), Streams.UTF8));
int numberOfNames = 0;
while (reader.readLine() != null) {
numberOfNames++;
}
reader.close();
- reader = new BufferedReader(new InputStreamReader(nodeNames.openStream()));
+ reader = new BufferedReader(new InputStreamReader(nodeNames.openStream(), Streams.UTF8));
int number = ((ThreadLocalRandom.current().nextInt(numberOfNames)) % numberOfNames);
for (int i = 0; i < number; i++) {
reader.readLine();
@@ -66,7 +68,7 @@ public abstract class Names {
return null;
}
try {
- BufferedReader reader = new BufferedReader(new InputStreamReader(nodeNames));
+ BufferedReader reader = new BufferedReader(new InputStreamReader(nodeNames, Streams.UTF8));
int numberOfNames = Integer.parseInt(reader.readLine());
int number = ((new Random().nextInt(numberOfNames)) % numberOfNames) - 2; // remove 2 for last line and first line
for (int i = 0; i < number; i++) {
diff --git a/src/main/java/org/elasticsearch/common/StopWatch.java b/src/main/java/org/elasticsearch/common/StopWatch.java
index 4592ae278c8..469d446bcc7 100644
--- a/src/main/java/org/elasticsearch/common/StopWatch.java
+++ b/src/main/java/org/elasticsearch/common/StopWatch.java
@@ -24,6 +24,7 @@ import org.elasticsearch.common.unit.TimeValue;
import java.text.NumberFormat;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.concurrent.TimeUnit;
/**
@@ -228,10 +229,10 @@ public class StopWatch {
sb.append("-----------------------------------------\n");
sb.append("ms % Task name\n");
sb.append("-----------------------------------------\n");
- NumberFormat nf = NumberFormat.getNumberInstance();
+ NumberFormat nf = NumberFormat.getNumberInstance(Locale.ROOT);
nf.setMinimumIntegerDigits(5);
nf.setGroupingUsed(false);
- NumberFormat pf = NumberFormat.getPercentInstance();
+ NumberFormat pf = NumberFormat.getPercentInstance(Locale.ROOT);
pf.setMinimumIntegerDigits(3);
pf.setGroupingUsed(false);
for (TaskInfo task : taskInfo()) {
diff --git a/src/main/java/org/elasticsearch/common/Strings.java b/src/main/java/org/elasticsearch/common/Strings.java
index 3c001fe28fe..dd903042060 100644
--- a/src/main/java/org/elasticsearch/common/Strings.java
+++ b/src/main/java/org/elasticsearch/common/Strings.java
@@ -424,8 +424,8 @@ public class Strings {
if (str.length() < prefix.length()) {
return false;
}
- String lcStr = str.substring(0, prefix.length()).toLowerCase();
- String lcPrefix = prefix.toLowerCase();
+ String lcStr = str.substring(0, prefix.length()).toLowerCase(Locale.ROOT);
+ String lcPrefix = prefix.toLowerCase(Locale.ROOT);
return lcStr.equals(lcPrefix);
}
@@ -448,8 +448,8 @@ public class Strings {
return false;
}
- String lcStr = str.substring(str.length() - suffix.length()).toLowerCase();
- String lcSuffix = suffix.toLowerCase();
+ String lcStr = str.substring(str.length() - suffix.length()).toLowerCase(Locale.ROOT);
+ String lcSuffix = suffix.toLowerCase(Locale.ROOT);
return lcStr.equals(lcSuffix);
}
diff --git a/src/main/java/org/elasticsearch/common/inject/Scopes.java b/src/main/java/org/elasticsearch/common/inject/Scopes.java
index 7aedc52714a..ed5b261189f 100644
--- a/src/main/java/org/elasticsearch/common/inject/Scopes.java
+++ b/src/main/java/org/elasticsearch/common/inject/Scopes.java
@@ -21,6 +21,7 @@ import org.elasticsearch.common.inject.internal.InternalFactory;
import org.elasticsearch.common.inject.internal.Scoping;
import java.lang.annotation.Annotation;
+import java.util.Locale;
/**
* Built-in scope implementations.
@@ -61,7 +62,7 @@ public class Scopes {
}
public String toString() {
- return String.format("%s[%s]", creator, SINGLETON);
+ return String.format(Locale.ROOT, "%s[%s]", creator, SINGLETON);
}
};
}
diff --git a/src/main/java/org/elasticsearch/common/inject/internal/Errors.java b/src/main/java/org/elasticsearch/common/inject/internal/Errors.java
index c764fdb4251..285134dd113 100644
--- a/src/main/java/org/elasticsearch/common/inject/internal/Errors.java
+++ b/src/main/java/org/elasticsearch/common/inject/internal/Errors.java
@@ -430,7 +430,7 @@ public final class Errors implements Serializable {
for (int i = 0; i < arguments.length; i++) {
arguments[i] = Errors.convert(arguments[i]);
}
- return String.format(messageFormat, arguments);
+ return String.format(Locale.ROOT, messageFormat, arguments);
}
public List getMessages() {
@@ -452,36 +452,41 @@ public final class Errors implements Serializable {
* Returns the formatted message for an exception with the specified messages.
*/
public static String format(String heading, Collection errorMessages) {
- Formatter fmt = new Formatter().format(heading).format(":%n%n");
- int index = 1;
- boolean displayCauses = getOnlyCause(errorMessages) == null;
-
- for (Message errorMessage : errorMessages) {
- fmt.format("%s) %s%n", index++, errorMessage.getMessage());
-
- List