SOLR-7258: Forbid MessageFormat.format and MessageFormat single-arg constructor

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1667414 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Shalin Shekhar Mangar 2015-03-17 21:52:05 +00:00
parent fd8a588bc5
commit 8d64c08c1a
17 changed files with 71 additions and 56 deletions

View File

@ -70,7 +70,7 @@ public class NLS {
String str = getLocalizedMessage(key, locale);
if (args.length > 0) {
str = MessageFormat.format(str, args);
str = new MessageFormat(str, Locale.ROOT).format(args);
}
return str;

View File

@ -34,3 +34,7 @@ java.io.File#delete() @ use Files.delete for real exception, IOUtils.deleteFiles
@defaultMessage Use shuffle(List, Random) instead so that it can be reproduced
java.util.Collections#shuffle(java.util.List)
@defaultMessage Construct MessageFormat(String pattern, String locale) and then use the format(String,Object...) method
java.text.MessageFormat#format(java.lang.String,java.lang.Object[])
java.text.MessageFormat#<init>(java.lang.String)

View File

@ -332,6 +332,9 @@ Other Changes
* SOLR-7246: Speed up BasicZkTest, TestManagedResourceStorage (Ramkumar Aiyengar)
* SOLR-7258: Forbid MessageFormat.format and MessageFormat single-arg constructor.
(shalin)
================== 5.0.0 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

View File

@ -38,6 +38,7 @@ import org.apache.lucene.search.join.BitDocIdSetCachingWrapperFilter;
import org.apache.lucene.search.join.BitDocIdSetFilter;
import org.apache.lucene.search.join.ScoreMode;
import org.apache.lucene.search.join.ToParentBlockJoinQuery;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.handler.dataimport.config.ConfigNameConstants;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.SolrIndexSearcher;
@ -335,9 +336,9 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
String children = createChildren(parentType, 0, depth, parentData, holder);
String rootFields = createFieldsList(FIELD_ID, "desc", "type_s");
String rootEntity = MessageFormat.format(rootEntityTemplate, parentType, "SELECT * FROM " + parentType, rootFields, children);
String rootEntity = StrUtils.formatString(rootEntityTemplate, parentType, "SELECT * FROM " + parentType, rootFields, children);
String config = MessageFormat.format(dataConfigTemplate, rootEntity);
String config = StrUtils.formatString(dataConfigTemplate, rootEntity);
return config;
}
@ -398,7 +399,7 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
List<Hierarchy> childData = createMockedIterator(childName, parentData, holder);
String subChildren = createChildren(childName, currentLevel + 1, maxLevel, childData, holder);
String child = MessageFormat.format(childEntityTemplate, childName, select, fields, subChildren);
String child = StrUtils.formatString(childEntityTemplate, childName, select, fields, subChildren);
builder.append(child);
builder.append('\n');
}

View File

@ -45,6 +45,7 @@ import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.cloud.ZooKeeperException;
import org.apache.solr.common.params.CollectionParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.common.util.URLUtil;
import org.apache.solr.core.CloseHook;
import org.apache.solr.core.CloudConfig;
@ -2168,8 +2169,8 @@ public final class ZkController {
log.warn("could not get stat");
}
log.info(MessageFormat.format(errMsg, resourceLocation, znodeVersion));
throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, MessageFormat.format(errMsg, resourceLocation, znodeVersion) + ", retry.");
log.info(StrUtils.formatString(errMsg, resourceLocation, znodeVersion));
throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, StrUtils.formatString(errMsg, resourceLocation, znodeVersion) + ", retry.");
}
}
}
@ -2183,8 +2184,8 @@ public final class ZkController {
log.error(e.getMessage());
}
log.info(MessageFormat.format(errMsg + " zkVersion= " + v, resourceLocation, znodeVersion));
throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, MessageFormat.format(errMsg, resourceLocation, znodeVersion) + ", retry.");
log.info(StrUtils.formatString(errMsg + " zkVersion= " + v, resourceLocation, znodeVersion));
throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, StrUtils.formatString(errMsg, resourceLocation, znodeVersion) + ", retry.");
} catch (ResourceModifiedInZkException e) {
throw e;
} catch (Exception e) {

View File

@ -135,7 +135,7 @@ public class ConfigOverlay implements MapSerializable{
private List<String> checkEditable(String propName, boolean isXPath, boolean failOnError) {
LinkedList<String> hierarchy = new LinkedList<>();
if(!isEditableProp(propName, isXPath,hierarchy)) {
if(failOnError) throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, MessageFormat.format( NOT_EDITABLE,propName));
if(failOnError) throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, StrUtils.formatString( NOT_EDITABLE,propName));
else return null;
}
return hierarchy;

View File

@ -32,6 +32,7 @@ import org.apache.lucene.analysis.util.ResourceLoader;
import org.apache.lucene.analysis.util.ResourceLoaderAware;
import org.apache.solr.cloud.CloudUtil;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.handler.component.SearchComponent;
import org.apache.solr.request.SolrRequestHandler;
@ -415,7 +416,7 @@ public class PluginBag<T> implements AutoCloseable {
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "No public keys are available in ZK to verify signature for runtime lib " + name);
}
} else if (sig == null) {
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, MessageFormat.format("runtimelib {0} should be signed with one of the keys in ZK /keys/exe ", name));
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, StrUtils.formatString("runtimelib {0} should be signed with one of the keys in ZK /keys/exe ", name));
}
try {

View File

@ -22,7 +22,6 @@ import java.io.OutputStream;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -135,7 +134,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
"size", payload.limit(),
"blob", payload);
verifyWithRealtimeGet(blobName, version, req, doc);
log.info(MessageFormat.format("inserting new blob {0} ,size {1}, md5 {2}", doc.get("id"), String.valueOf(payload.limit()), md5));
log.info(StrUtils.formatString("inserting new blob {0} ,size {1}, md5 {2}", doc.get("id"), String.valueOf(payload.limit()), md5));
indexMap(req, rsp, doc);
log.info(" Successfully Added and committed a blob with id {} and size {} ", id, payload.limit());
@ -159,7 +158,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
} else {
String q = "blobName:{0}";
if (version != -1) q = "id:{0}/{1}";
QParser qparser = QParser.getParser(MessageFormat.format(q, blobName, version), "lucene", req);
QParser qparser = QParser.getParser(StrUtils.formatString(q, blobName, version), "lucene", req);
final TopDocs docs = req.getSearcher().search(qparser.parse(), 1, new Sort(new SortField("version", SortField.Type.LONG, true)));
if (docs.totalHits > 0) {
rsp.add(ReplicationHandler.FILE_STREAM, new SolrCore.RawWriter() {
@ -181,7 +180,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
} else {
throw new SolrException(SolrException.ErrorCode.NOT_FOUND,
MessageFormat.format("Invalid combination of blobName {0} and version {1}", blobName, String.valueOf(version)));
StrUtils.formatString("Invalid combination of blobName {0} and version {1}", blobName, version));
}
}
@ -196,7 +195,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
req.forward(null,
new MapSolrParams((Map) makeMap(
"q", MessageFormat.format(q, blobName, version),
"q", StrUtils.formatString(q, blobName, version),
"fl", "id,size,version,timestamp,blobName,md5",
"sort", "version desc"))
, rsp);

View File

@ -55,7 +55,6 @@ import org.apache.solr.util.CommandOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static java.text.MessageFormat.format;
import static java.util.Collections.singletonList;
import static org.apache.solr.common.params.CoreAdminParams.NAME;
import static org.apache.solr.core.ConfigOverlay.NOT_EDITABLE;
@ -253,7 +252,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
if (op.hasError()) break;
for (String s : name) {
if (params.getParams(s) == null) {
op.addError(MessageFormat.format("can't delete . No such params ''{0}'' exist", s));
op.addError(StrUtils.formatString("can't delete . No such params ''{0}'' exist", s));
}
params = params.setParams(s, null);
}
@ -303,7 +302,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
default: {
List<String> pcs = StrUtils.splitSmart(op.name.toLowerCase(Locale.ROOT), '-');
if (pcs.size() != 2) {
op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
op.addError(StrUtils.formatString("Unknown operation ''{0}'' ", op.name));
} else {
String prefix = pcs.get(0);
String name = pcs.get(1);
@ -315,7 +314,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
overlay = updateNamedPlugin(info, op, overlay, prefix.equals("create") || prefix.equals("add"));
}
} else {
op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
op.addError(StrUtils.formatString("Unknown operation ''{0}'' ", op.name));
}
}
}
@ -348,7 +347,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
if (overlay.getNamedPlugins(typ).containsKey(name)) {
return overlay.deleteNamedPlugin(name, typ);
} else {
op.addError(MessageFormat.format("NO such {0} ''{1}'' ", typ, name));
op.addError(StrUtils.formatString("NO such {0} ''{1}'' ", typ, name));
return overlay;
}
}
@ -363,7 +362,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
if (!verifyClass(op, clz, info.clazz)) return overlay;
if (overlay.getNamedPlugins(info.tag).containsKey(name)) {
if (isCeate) {
op.addError(MessageFormat.format(" ''{0}'' already exists . Do an ''{1}'' , if you want to change it ", name, "update-" + info.tag.toLowerCase(Locale.ROOT)));
op.addError(StrUtils.formatString(" ''{0}'' already exists . Do an ''{1}'' , if you want to change it ", name, "update-" + info.tag.toLowerCase(Locale.ROOT)));
return overlay;
} else {
return overlay.addNamedPlugin(op.getDataMap(), info.tag);
@ -372,7 +371,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
if (isCeate) {
return overlay.addNamedPlugin(op.getDataMap(), info.tag);
} else {
op.addError(MessageFormat.format(" ''{0}'' does not exist . Do an ''{1}'' , if you want to create it ", name, "create-" + info.tag.toLowerCase(Locale.ROOT)));
op.addError(StrUtils.formatString(" ''{0}'' does not exist . Do an ''{1}'' , if you want to create it ", name, "create-" + info.tag.toLowerCase(Locale.ROOT)));
return overlay;
}
}
@ -409,7 +408,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
if (op.hasError()) return overlay;
for (String o : name) {
if (!overlay.getUserProps().containsKey(o)) {
op.addError(format("No such property ''{0}''", name));
op.addError(StrUtils.formatString("No such property ''{0}''", name));
} else {
overlay = overlay.unsetUserProperty(o);
}
@ -424,7 +423,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
for (String o : name) {
if (!ConfigOverlay.isEditableProp(o, false, null)) {
op.addError(format(NOT_EDITABLE, name));
op.addError(StrUtils.formatString(NOT_EDITABLE, name));
} else {
overlay = overlay.unsetProperty(o);
}
@ -439,7 +438,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
String name = e.getKey();
Object val = e.getValue();
if (!ConfigOverlay.isEditableProp(name, false, null)) {
op.addError(format(NOT_EDITABLE, name));
op.addError(StrUtils.formatString(NOT_EDITABLE, name));
continue;
}
overlay = overlay.setProperty(name, val);
@ -460,7 +459,7 @@ public class SolrConfigHandler extends RequestHandlerBase {
c == '.'
) continue;
else {
return MessageFormat.format("''{0}'' name should only have chars [a-zA-Z_-.0-9] ", s);
return StrUtils.formatString("''{0}'' name should only have chars [a-zA-Z_-.0-9] ", s);
}
}
return null;

View File

@ -29,6 +29,7 @@ import java.util.Map;
import org.apache.lucene.util.IOUtils;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.util.StrUtils;
import org.noggit.JSONParser;
import org.noggit.ObjectBuilder;
@ -61,13 +62,13 @@ public class CommandOperation {
//noinspection unchecked
return (Map<String,Object>)commandData;
}
addError(MessageFormat.format("The command ''{0}'' should have the values as a json object {key:val} format", name));
addError(StrUtils.formatString("The command ''{0}'' should have the values as a json object {key:val} format", name));
return Collections.emptyMap();
}
private Object getRootPrimitive() {
if (commandData instanceof Map) {
errors.add(MessageFormat.format("The value has to be a string for command : ''{0}'' ", name));
errors.add(StrUtils.formatString("The value has to be a string for command : ''{0}'' ", name));
return null;
}
return commandData;
@ -92,7 +93,7 @@ public class CommandOperation {
public List<String> getStrs(String key) {
List<String> val = getStrs(key, null);
if (val == null) {
errors.add(MessageFormat.format(REQD, key));
errors.add(StrUtils.formatString(REQD, key));
}
return val;
@ -136,13 +137,13 @@ public class CommandOperation {
if (ROOT_OBJ.equals(key)) {
Object obj = getRootPrimitive();
if (obj == null) {
errors.add(MessageFormat.format(REQD, name));
errors.add(StrUtils.formatString(REQD, name));
}
return obj == null ? null : String.valueOf(obj);
}
String s = getStr(key, null);
if (s == null) errors.add(MessageFormat.format(REQD, key));
if (s == null) errors.add(StrUtils.formatString(REQD, key));
return s;
}
@ -232,7 +233,7 @@ public class CommandOperation {
Object o = getMapVal(key);
if (o == null) return def;
if (!(o instanceof Map)) {
addError(MessageFormat.format("''{0}'' must be a map", key));
addError(StrUtils.formatString("''{0}'' must be a map", key));
return def;
} else {
return (Map) o;

View File

@ -396,7 +396,7 @@ public class TestSolrConfigHandler extends RestTestBase {
}
assertTrue(MessageFormat.format("Could not get expected value ''{0}'' for path ''{1}'' full output: {2}", expected, StrUtils.join(jsonPath, '/'), getAsString(m)), success);
assertTrue(StrUtils.formatString("Could not get expected value ''{0}'' for path ''{1}'' full output: {2}", expected, StrUtils.join(jsonPath, '/'), getAsString(m)), success);
return m;
}

View File

@ -34,6 +34,7 @@ import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.core.ConfigOverlay;
import org.apache.solr.update.DirectUpdateHandler2;
import org.apache.solr.util.SimplePostTool;
@ -47,7 +48,6 @@ import java.io.IOException;
import java.io.StringReader;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -146,7 +146,7 @@ public class TestBlobHandler extends AbstractFullDistribZkTestBase {
assertEquals("" + bytes.limit(), String.valueOf(map.get("size")));
return;
}
fail(MessageFormat.format("Could not successfully add blob after {0} attempts. Expecting {1} items. time elapsed {2} output for url is {3}",
fail(StrUtils.formatString("Could not successfully add blob after {0} attempts. Expecting {1} items. time elapsed {2} output for url is {3}",
i, count, System.currentTimeMillis() - start, getAsString(map)));
}

View File

@ -41,6 +41,7 @@ import org.apache.solr.common.cloud.Slice;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkConfigManager;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.core.SolrConfig;
import org.apache.solr.util.RESTfulServerProvider;
import org.apache.solr.util.RestTestHarness;
@ -136,7 +137,7 @@ public class TestConfigReload extends AbstractFullDistribZkTestBase {
if(succeeded.size() == urls.size()) break;
succeeded.clear();
}
assertEquals(MessageFormat.format("tried these servers {0} succeeded only in {1} ", urls,succeeded) , urls.size(), succeeded.size());
assertEquals(StrUtils.formatString("tried these servers {0} succeeded only in {1} ", urls, succeeded) , urls.size(), succeeded.size());
}
private Map getAsMap(String uri) throws Exception {

View File

@ -34,6 +34,7 @@ import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.Slice;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.core.ConfigOverlay;
import org.apache.solr.core.RequestParams;
import org.apache.solr.core.TestSolrConfigHandler;
@ -266,7 +267,7 @@ public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
}
public static void compareValues(Map result, Object expected, List<String> jsonPath) {
assertTrue(MessageFormat.format("Could not get expected value {0} for path {1} full output {2}", expected, jsonPath, getAsString(result)),
assertTrue(StrUtils.formatString("Could not get expected value {0} for path {1} full output {2}", expected, jsonPath, getAsString(result)),
Objects.equals(expected, ConfigOverlay.getObjectByPath(result, false, jsonPath)));
}

View File

@ -43,6 +43,7 @@ import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.Slice;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.core.ConfigOverlay;
import org.apache.solr.util.RESTfulServerProvider;
import org.apache.solr.util.RestTestHarness;
@ -183,19 +184,19 @@ public class TestSolrConfigHandlerConcurrent extends AbstractFullDistribZkTestBa
Map m = (Map) respMap.get("overlay");
if(m!= null) m = (Map) m.get("props");
if(m == null) {
errmessages.add(MessageFormat.format( "overlay does not exist for cache: {0} , iteration: {1} response {2} ", cacheName, i, respMap.toString()));
errmessages.add(StrUtils.formatString("overlay does not exist for cache: {0} , iteration: {1} response {2} ", cacheName, i, respMap.toString()));
continue;
}
Object o = getObjectByPath(m, true, asList("query", cacheName, "size"));
if(!val1.equals(o)) errmessages.add(MessageFormat.format("'size' property not set, expected = {0}, actual {1}", val1,o));
if(!val1.equals(o)) errmessages.add(StrUtils.formatString("'size' property not set, expected = {0}, actual {1}", val1, o));
o = getObjectByPath(m, true, asList("query", cacheName, "initialSize"));
if(!val2.equals(o)) errmessages.add(MessageFormat.format("'initialSize' property not set, expected = {0}, actual {1}", val2,o));
if(!val2.equals(o)) errmessages.add(StrUtils.formatString("'initialSize' property not set, expected = {0}, actual {1}", val2, o));
o = getObjectByPath(m, true, asList("query", cacheName, "autowarmCount"));
if(!val3.equals(o)) errmessages.add(MessageFormat.format("'autowarmCount' property not set, expected = {0}, actual {1}", val3,o));
if(!val3.equals(o)) errmessages.add(StrUtils.formatString("'autowarmCount' property not set, expected = {0}, actual {1}", val3, o));
if(errmessages.isEmpty()) break;
}
if(!errmessages.isEmpty()) {

View File

@ -18,7 +18,6 @@ package org.apache.solr.schema;
*/
import static java.text.MessageFormat.format;
import static org.apache.solr.rest.schema.TestBulkSchemaAPI.getSourceCopyFields;
import static org.apache.solr.rest.schema.TestBulkSchemaAPI.getObj;
@ -36,6 +35,7 @@ import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.util.RESTfulServerProvider;
import org.apache.solr.util.RestTestHarness;
import org.junit.BeforeClass;
@ -173,17 +173,17 @@ public class TestBulkSchemaConcurrent extends AbstractFullDistribZkTestBase {
while (TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutMillis) {
errmessages.clear();
Map m = getObj(harness, aField, "fields");
if (m == null) errmessages.add(format("field {0} not created", aField));
if (m == null) errmessages.add(StrUtils.formatString("field {0} not created", aField));
m = getObj(harness, dynamicFldName, "dynamicFields");
if (m == null) errmessages.add(format("dynamic field {0} not created", dynamicFldName));
if (m == null) errmessages.add(StrUtils.formatString("dynamic field {0} not created", dynamicFldName));
List l = getSourceCopyFields(harness, aField);
if (!checkCopyField(l, aField, dynamicCopyFldDest))
errmessages.add(format("CopyField source={0},dest={1} not created", aField, dynamicCopyFldDest));
errmessages.add(StrUtils.formatString("CopyField source={0},dest={1} not created", aField, dynamicCopyFldDest));
m = getObj(harness, newFieldTypeName, "fieldTypes");
if (m == null) errmessages.add(format("new type {0} not created", newFieldTypeName));
if (m == null) errmessages.add(StrUtils.formatString("new type {0} not created", newFieldTypeName));
if (errmessages.isEmpty()) break;
@ -243,17 +243,17 @@ public class TestBulkSchemaConcurrent extends AbstractFullDistribZkTestBase {
while (TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutMillis) {
errmessages.clear();
Map m = getObj(harness, aField, "fields");
if (m == null) errmessages.add(format("field {0} no longer present", aField));
if (m == null) errmessages.add(StrUtils.formatString("field {0} no longer present", aField));
m = getObj(harness, dynamicFldName, "dynamicFields");
if (m == null) errmessages.add(format("dynamic field {0} no longer present", dynamicFldName));
if (m == null) errmessages.add(StrUtils.formatString("dynamic field {0} no longer present", dynamicFldName));
List l = getSourceCopyFields(harness, aField);
if (!checkCopyField(l, aField, dynamicCopyFldDest))
errmessages.add(format("CopyField source={0},dest={1} no longer present", aField, dynamicCopyFldDest));
errmessages.add(StrUtils.formatString("CopyField source={0},dest={1} no longer present", aField, dynamicCopyFldDest));
m = getObj(harness, newFieldTypeName, "fieldTypes");
if (m == null) errmessages.add(format("new type {0} no longer present", newFieldTypeName));
if (m == null) errmessages.add(StrUtils.formatString("new type {0} no longer present", newFieldTypeName));
if (errmessages.isEmpty()) break;
@ -305,17 +305,17 @@ public class TestBulkSchemaConcurrent extends AbstractFullDistribZkTestBase {
while (TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutMillis) {
errmessages.clear();
Map m = getObj(harness, aField, "fields");
if (m != null) errmessages.add(format("field {0} still exists", aField));
if (m != null) errmessages.add(StrUtils.formatString("field {0} still exists", aField));
m = getObj(harness, dynamicFldName, "dynamicFields");
if (m != null) errmessages.add(format("dynamic field {0} still exists", dynamicFldName));
if (m != null) errmessages.add(StrUtils.formatString("dynamic field {0} still exists", dynamicFldName));
List l = getSourceCopyFields(harness, aField);
if (checkCopyField(l, aField, dynamicCopyFldDest))
errmessages.add(format("CopyField source={0},dest={1} still exists", aField, dynamicCopyFldDest));
errmessages.add(StrUtils.formatString("CopyField source={0},dest={1} still exists", aField, dynamicCopyFldDest));
m = getObj(harness, newFieldTypeName, "fieldTypes");
if (m != null) errmessages.add(format("new type {0} still exists", newFieldTypeName));
if (m != null) errmessages.add(StrUtils.formatString("new type {0} still exists", newFieldTypeName));
if (errmessages.isEmpty()) break;

View File

@ -17,6 +17,7 @@
package org.apache.solr.common.util;
import java.text.MessageFormat;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
@ -305,5 +306,7 @@ public class StrUtils {
}
}
public static String formatString(String pattern, Object... args) {
return new MessageFormat(pattern, Locale.ROOT).format(args);
}
}