Index: solr/contrib/extraction/src/main/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java =================================================================== --- solr/contrib/extraction/src/main/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java (revision 945097) +++ solr/contrib/extraction/src/main/java/org/apache/solr/handler/extraction/ExtractingDocumentLoader.java (working copy) @@ -22,6 +22,7 @@ import org.apache.solr.common.params.UpdateParams; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.schema.IndexSchema; @@ -135,7 +136,7 @@ String streamType = req.getParams().get(ExtractingParams.STREAM_TYPE, null); if (streamType != null) { //Cache? Parsers are lightweight to construct and thread-safe, so I'm told - MediaType mt = MediaType.parse(streamType.trim().toLowerCase()); + MediaType mt = MediaType.parse(streamType.trim().toLowerCase(StrUtils.ROOT_LOCALE)); parser = config.getParser(mt); } else { parser = autoDetectParser; Index: solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestCachedSqlEntityProcessor.java =================================================================== --- solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestCachedSqlEntityProcessor.java (revision 945097) +++ solr/contrib/dataimporthandler/src/test/java/org/apache/solr/handler/dataimport/TestCachedSqlEntityProcessor.java (working copy) @@ -16,6 +16,7 @@ */ package org.apache.solr.handler.dataimport; +import org.apache.solr.common.util.StrUtils; import org.junit.Assert; import org.junit.Test; @@ -111,7 +112,7 @@ if (r == null) break; rows.add(r); - Assert.assertEquals(r.get("desc").toString().toUpperCase(), r.get("desc")); + Assert.assertEquals(r.get("desc").toString().toUpperCase(StrUtils.ROOT_LOCALE), r.get("desc")); } Assert.assertEquals(2, rows.size()); Assert.assertEquals(2, rows.get(0).size()); @@ -178,7 +179,7 @@ Object val = entry.getValue(); if (val instanceof String) { String s = (String) val; - entry.setValue(s.toUpperCase()); + entry.setValue(s.toUpperCase(StrUtils.ROOT_LOCALE)); } } return row; Index: solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/NumberFormatTransformer.java =================================================================== --- solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/NumberFormatTransformer.java (revision 945097) +++ solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/NumberFormatTransformer.java (working copy) @@ -26,6 +26,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.solr.common.util.StrUtils; + /** *

* A Transformer instance which can extract numbers out of strings. It uses @@ -72,7 +74,7 @@ } Object val = row.get(srcCol); - String styleSmall = style.toLowerCase(); + String styleSmall = style.toLowerCase(StrUtils.ROOT_LOCALE); if (val instanceof List) { List inputs = (List) val; Index: solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java =================================================================== --- solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java (revision 945097) +++ solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DataImporter.java (working copy) @@ -22,6 +22,8 @@ import org.apache.solr.schema.IndexSchema; import org.apache.solr.schema.SchemaField; import org.apache.solr.common.util.ContentStream; +import org.apache.solr.common.util.StrUtils; + import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow; import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE; import org.slf4j.Logger; @@ -98,7 +100,7 @@ loadDataConfig(dataConfig); for (Map.Entry entry : schema.getFields().entrySet()) { - config.lowerNameVsSchemaField.put(entry.getKey().toLowerCase(), entry.getValue()); + config.lowerNameVsSchemaField.put(entry.getKey().toLowerCase(StrUtils.ROOT_LOCALE), entry.getValue()); } for (DataConfig.Entity e : config.document.entities) { @@ -125,7 +127,7 @@ DataConfig.Field fld = entry.getValue(); SchemaField field = schema.getFieldOrNull(fld.getName()); if (field == null) { - field = config.lowerNameVsSchemaField.get(fld.getName().toLowerCase()); + field = config.lowerNameVsSchemaField.get(fld.getName().toLowerCase(StrUtils.ROOT_LOCALE)); if (field == null) { LOG.info("The field :" + fld.getName() + " present in DataConfig does not have a counterpart in Solr Schema"); } @@ -215,7 +217,7 @@ } SchemaField schemaField = schema.getFieldOrNull(f.getName()); if (schemaField == null) { - schemaField = config.lowerNameVsSchemaField.get(f.getName().toLowerCase()); + schemaField = config.lowerNameVsSchemaField.get(f.getName().toLowerCase(StrUtils.ROOT_LOCALE)); if (schemaField != null) f.name = schemaField.getName(); } if (schemaField != null) { Index: solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java =================================================================== --- solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java (revision 945097) +++ solr/contrib/dataimporthandler/src/main/java/org/apache/solr/handler/dataimport/DocBuilder.java (working copy) @@ -18,10 +18,10 @@ package org.apache.solr.handler.dataimport; import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.core.SolrCore; import static org.apache.solr.handler.dataimport.SolrWriter.LAST_INDEX_KEY; import static org.apache.solr.handler.dataimport.DataImportHandlerException.*; -import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow; import org.apache.solr.schema.SchemaField; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -744,7 +744,7 @@ // This can be a dynamic field or a field which does not have an entry in data-config ( an implicit field) SchemaField sf = dataImporter.getSchema().getFieldOrNull(key); if (sf == null) { - sf = dataImporter.getConfig().lowerNameVsSchemaField.get(key.toLowerCase()); + sf = dataImporter.getConfig().lowerNameVsSchemaField.get(key.toLowerCase(StrUtils.ROOT_LOCALE)); } if (sf != null) { addFieldToDoc(entry.getValue(), sf.getName(), 1.0f, sf.multiValued(), doc); Index: solr/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java =================================================================== --- solr/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java (revision 945097) +++ solr/contrib/dataimporthandler/src/extras/main/java/org/apache/solr/handler/dataimport/MailEntityProcessor.java (working copy) @@ -17,6 +17,8 @@ package org.apache.solr.handler.dataimport; import com.sun.mail.imap.IMAPMessage; + +import org.apache.solr.common.util.StrUtils; import org.apache.tika.config.TikaConfig; import org.apache.tika.utils.ParseUtils; import org.slf4j.Logger; @@ -161,7 +163,7 @@ if (!processAttachment || (disp != null && disp.equalsIgnoreCase(Part.ATTACHMENT))) return; InputStream is = part.getInputStream(); String fileName = part.getFileName(); - String content = ParseUtils.getStringContent(is, TikaConfig.getDefaultConfig(), ctype.getBaseType().toLowerCase()); + String content = ParseUtils.getStringContent(is, TikaConfig.getDefaultConfig(), ctype.getBaseType().toLowerCase(StrUtils.ROOT_LOCALE)); if (disp != null && disp.equalsIgnoreCase(Part.ATTACHMENT)) { if (row.get(ATTACHMENT) == null) row.put(ATTACHMENT, new ArrayList()); Index: solr/lib/commons-codec-1.3.jar =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: solr/lib/commons-codec-1.4.jar =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Property changes on: solr\lib\commons-codec-1.4.jar ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Index: solr/src/test/org/apache/solr/core/TestConfig.java =================================================================== --- solr/src/test/org/apache/solr/core/TestConfig.java (revision 945097) +++ solr/src/test/org/apache/solr/core/TestConfig.java (working copy) @@ -19,6 +19,7 @@ import org.apache.lucene.index.IndexWriter; import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.handler.admin.ShowFileRequestHandler; import org.apache.solr.search.SolrIndexReader; import org.apache.solr.search.SolrIndexSearcher; @@ -112,7 +113,7 @@ //System.out.println( handler.getHiddenFiles() ); // should not contain: solrconfig.xml scheam.xml admin-extra.html - assertFalse(handler.getHiddenFiles().contains("scheam.xml".toUpperCase())); + assertFalse(handler.getHiddenFiles().contains("scheam.xml".toUpperCase(StrUtils.ROOT_LOCALE))); assertTrue(handler.getHiddenFiles().contains("PROTWORDS.TXT")); } Index: solr/src/test/org/apache/solr/request/TestBinaryResponseWriter.java =================================================================== --- solr/src/test/org/apache/solr/request/TestBinaryResponseWriter.java (revision 945097) +++ solr/src/test/org/apache/solr/request/TestBinaryResponseWriter.java (working copy) @@ -21,6 +21,7 @@ import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.JavaBinCodec; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.response.BinaryQueryResponseWriter; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.util.AbstractSolrTestCase; @@ -49,7 +50,7 @@ * Tests known types implementation by asserting correct encoding/decoding of UUIDField */ public void testUUID() throws Exception { - String s = UUID.randomUUID().toString().toLowerCase(); + String s = UUID.randomUUID().toString().toLowerCase(StrUtils.ROOT_LOCALE); assertU(adoc("id", "101", "uuid", s)); assertU(commit()); LocalSolrQueryRequest req = lrf.makeRequest("q", "*:*"); Index: solr/src/java/org/apache/solr/schema/TrieField.java =================================================================== --- solr/src/java/org/apache/solr/schema/TrieField.java (revision 945097) +++ solr/src/java/org/apache/solr/schema/TrieField.java (working copy) @@ -25,6 +25,7 @@ import org.apache.lucene.analysis.NumericTokenStream; import org.apache.solr.analysis.*; import org.apache.solr.common.SolrException; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.response.TextResponseWriter; import org.apache.solr.response.XMLWriter; import org.apache.solr.search.QParser; @@ -77,7 +78,7 @@ if (t != null) { try { - type = TrieTypes.valueOf(t.toUpperCase()); + type = TrieTypes.valueOf(t.toUpperCase(StrUtils.ROOT_LOCALE)); } catch (IllegalArgumentException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Invalid type specified in schema.xml for field: " + args.get("name"), e); Index: solr/src/java/org/apache/solr/schema/UUIDField.java =================================================================== --- solr/src/java/org/apache/solr/schema/UUIDField.java (revision 945097) +++ solr/src/java/org/apache/solr/schema/UUIDField.java (working copy) @@ -24,6 +24,7 @@ import org.apache.lucene.document.Fieldable; import org.apache.lucene.search.SortField; import org.apache.solr.common.SolrException; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.response.TextResponseWriter; import org.apache.solr.response.XMLWriter; @@ -76,7 +77,7 @@ @Override public String toInternal(String val) { if (val == null || 0==val.length() || NEW.equals(val)) { - return UUID.randomUUID().toString().toLowerCase(); + return UUID.randomUUID().toString().toLowerCase(StrUtils.ROOT_LOCALE); } else { // we do some basic validation if 'val' looks like an UUID if (val.length() != 36 || val.charAt(8) != DASH || val.charAt(13) != DASH @@ -85,12 +86,12 @@ "Invalid UUID String: '" + val + "'"); } - return val.toLowerCase(); + return val.toLowerCase(StrUtils.ROOT_LOCALE); } } public String toInternal(UUID uuid) { - return uuid.toString().toLowerCase(); + return uuid.toString().toLowerCase(StrUtils.ROOT_LOCALE); } @Override Index: solr/src/java/org/apache/solr/update/SolrIndexWriter.java =================================================================== --- solr/src/java/org/apache/solr/update/SolrIndexWriter.java (revision 945097) +++ solr/src/java/org/apache/solr/update/SolrIndexWriter.java (working copy) @@ -21,6 +21,7 @@ import org.apache.lucene.store.*; import org.apache.solr.common.SolrException; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.core.DirectoryFactory; import org.apache.solr.core.StandardDirectoryFactory; import org.apache.solr.schema.IndexSchema; @@ -121,7 +122,7 @@ log.warn("No lockType configured for " + path + " assuming 'simple'"); rawLockType = "simple"; } - final String lockType = rawLockType.toLowerCase().trim(); + final String lockType = rawLockType.toLowerCase(StrUtils.ROOT_LOCALE).trim(); if ("simple".equals(lockType)) { // multiple SimpleFSLockFactory instances should be OK Index: solr/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java =================================================================== --- solr/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java (revision 945097) +++ solr/src/java/org/apache/solr/analysis/PhoneticFilterFactory.java (working copy) @@ -28,6 +28,7 @@ import org.apache.commons.codec.language.Soundex; import org.apache.lucene.analysis.TokenStream; import org.apache.solr.common.SolrException; +import org.apache.solr.common.util.StrUtils; /** * Create tokens based on phonetic encoders @@ -50,10 +51,10 @@ private static final Map> registry; static { registry = new HashMap>(); - registry.put( "DoubleMetaphone".toUpperCase(), DoubleMetaphone.class ); - registry.put( "Metaphone".toUpperCase(), Metaphone.class ); - registry.put( "Soundex".toUpperCase(), Soundex.class ); - registry.put( "RefinedSoundex".toUpperCase(), RefinedSoundex.class ); + registry.put( "DoubleMetaphone".toUpperCase(StrUtils.ROOT_LOCALE), DoubleMetaphone.class ); + registry.put( "Metaphone".toUpperCase(StrUtils.ROOT_LOCALE), Metaphone.class ); + registry.put( "Soundex".toUpperCase(StrUtils.ROOT_LOCALE), Soundex.class ); + registry.put( "RefinedSoundex".toUpperCase(StrUtils.ROOT_LOCALE), RefinedSoundex.class ); } protected boolean inject = true; @@ -71,7 +72,7 @@ throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Missing required parameter: "+ENCODER +" ["+registry.keySet()+"]" ); } - Class clazz = registry.get(name.toUpperCase()); + Class clazz = registry.get(name.toUpperCase(StrUtils.ROOT_LOCALE)); if( clazz == null ) { throw new SolrException( SolrException.ErrorCode.SERVER_ERROR, "Unknown encoder: "+name +" ["+registry.keySet()+"]" ); } Index: solr/src/java/org/apache/solr/core/SolrConfig.java =================================================================== --- solr/src/java/org/apache/solr/core/SolrConfig.java (revision 945097) +++ solr/src/java/org/apache/solr/core/SolrConfig.java (working copy) @@ -20,6 +20,7 @@ import org.apache.solr.common.util.DOMUtil; import org.apache.solr.common.util.RegexFileFilter; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.handler.PingRequestHandler; import org.apache.solr.handler.component.SearchComponent; import org.apache.solr.request.LocalSolrQueryRequest; @@ -367,7 +368,7 @@ /** Input must not be null */ public static LastModFrom parse(final String s) { try { - return valueOf(s.toUpperCase()); + return valueOf(s.toUpperCase(StrUtils.ROOT_LOCALE)); } catch (Exception e) { log.warn( "Unrecognized value for lastModFrom: " + s, e); return BOGUS; Index: solr/src/java/org/apache/solr/core/Config.java =================================================================== --- solr/src/java/org/apache/solr/core/Config.java (revision 945097) +++ solr/src/java/org/apache/solr/core/Config.java (working copy) @@ -22,6 +22,8 @@ import org.xml.sax.SAXException; import org.apache.solr.common.SolrException; import org.apache.solr.common.util.DOMUtil; +import org.apache.solr.common.util.StrUtils; + import javax.xml.parsers.*; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; @@ -285,7 +287,7 @@ private static final AtomicBoolean versionWarningAlreadyLogged = new AtomicBoolean(false); public static final Version parseLuceneVersionString(final String matchVersion) { - String parsedMatchVersion = matchVersion.toUpperCase(); + String parsedMatchVersion = matchVersion.toUpperCase(StrUtils.ROOT_LOCALE); // be lenient with the supplied version parameter parsedMatchVersion = parsedMatchVersion.replaceFirst("^(\\d)\\.(\\d)$", "LUCENE_$1$2"); Index: solr/src/java/org/apache/solr/core/JmxMonitoredMap.java =================================================================== --- solr/src/java/org/apache/solr/core/JmxMonitoredMap.java (revision 945097) +++ solr/src/java/org/apache/solr/core/JmxMonitoredMap.java (working copy) @@ -18,6 +18,7 @@ import org.apache.solr.common.SolrException; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.core.SolrConfig.JmxConfiguration; import javax.management.*; @@ -243,7 +244,7 @@ if (staticStats.contains(attribute) && attribute != null && attribute.length() > 0) { try { - String getter = "get" + attribute.substring(0, 1).toUpperCase() + String getter = "get" + attribute.substring(0, 1).toUpperCase(StrUtils.ROOT_LOCALE) + attribute.substring(1); Method meth = infoBean.getClass().getMethod(getter); val = meth.invoke(infoBean); Index: solr/src/java/org/apache/solr/core/SolrCore.java =================================================================== --- solr/src/java/org/apache/solr/core/SolrCore.java (revision 945097) +++ solr/src/java/org/apache/solr/core/SolrCore.java (working copy) @@ -28,6 +28,7 @@ import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.handler.admin.ShowFileRequestHandler; import org.apache.solr.handler.component.*; import org.apache.solr.highlight.DefaultSolrHighlighter; @@ -1554,14 +1555,14 @@ File configdir = new File( solrConfig.getResourceLoader().getConfigDir() ); if( configdir.exists() && configdir.isDirectory() ) { for( String file : configdir.list() ) { - hide.add( file.toUpperCase() ); + hide.add( file.toUpperCase(StrUtils.ROOT_LOCALE) ); } } // except the "gettable" list StringTokenizer st = new StringTokenizer( gettable ); while( st.hasMoreTokens() ) { - hide.remove( st.nextToken().toUpperCase() ); + hide.remove( st.nextToken().toUpperCase(StrUtils.ROOT_LOCALE) ); } for( String s : hide ) { invariants.add( ShowFileRequestHandler.HIDDEN, s ); Index: solr/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java =================================================================== --- solr/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java (revision 945097) +++ solr/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java (working copy) @@ -32,6 +32,7 @@ import org.apache.solr.common.util.ContentStreamBase; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.core.SolrCore; import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.handler.RequestHandlerBase; @@ -105,7 +106,7 @@ String[] hidden = invariants.getParams( HIDDEN ); if( hidden != null ) { for( String s : hidden ) { - hiddenFiles.add( s.toUpperCase() ); + hiddenFiles.add( s.toUpperCase(StrUtils.ROOT_LOCALE) ); } } } @@ -129,7 +130,7 @@ } else { fname = fname.replace( '\\', '/' ); // normalize slashes - if( hiddenFiles.contains( fname.toUpperCase() ) ) { + if( hiddenFiles.contains( fname.toUpperCase(StrUtils.ROOT_LOCALE) ) ) { throw new SolrException( ErrorCode.FORBIDDEN, "Can not access: "+fname ); } if( fname.indexOf( ".." ) >= 0 ) { @@ -156,7 +157,7 @@ for( File f : adminFile.listFiles() ) { String path = f.getAbsolutePath().substring( basePath ); path = path.replace( '\\', '/' ); // normalize slashes - if( hiddenFiles.contains( path.toUpperCase() ) ) { + if( hiddenFiles.contains( path.toUpperCase(StrUtils.ROOT_LOCALE) ) ) { continue; // don't show 'hidden' files } if( f.isHidden() || f.getName().startsWith( "." ) ) { Index: solr/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java =================================================================== --- solr/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java (revision 945097) +++ solr/src/java/org/apache/solr/handler/admin/SystemInfoHandler.java (working copy) @@ -33,6 +33,7 @@ import org.apache.lucene.LucenePackage; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.common.util.XML; import org.apache.solr.core.SolrCore; import org.apache.solr.handler.RequestHandlerBase; @@ -122,7 +123,7 @@ addGetterIfAvaliable( os, "processCpuTime", info ); try { - if( !os.getName().toLowerCase().startsWith( "windows" ) ) { + if( !os.getName().toLowerCase(StrUtils.ROOT_LOCALE).startsWith( "windows" ) ) { // Try some command line things info.add( "uname", execute( "uname -a" ) ); info.add( "ulimit", execute( "ulimit -n" ) ); Index: solr/src/java/org/apache/solr/handler/component/TermsComponent.java =================================================================== --- solr/src/java/org/apache/solr/handler/component/TermsComponent.java (revision 945097) +++ solr/src/java/org/apache/solr/handler/component/TermsComponent.java (working copy) @@ -186,7 +186,7 @@ int flags = 0; for (String flagParam : flagParams) { try { - flags |= TermsParams.TermsRegexpFlag.valueOf(flagParam.toUpperCase()).getValue(); + flags |= TermsParams.TermsRegexpFlag.valueOf(flagParam.toUpperCase(StrUtils.ROOT_LOCALE)).getValue(); } catch (IllegalArgumentException iae) { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unknown terms regex flag '" + flagParam + "'"); } Index: solr/src/common/org/apache/solr/common/params/MoreLikeThisParams.java =================================================================== --- solr/src/common/org/apache/solr/common/params/MoreLikeThisParams.java (revision 945097) +++ solr/src/common/org/apache/solr/common/params/MoreLikeThisParams.java (working copy) @@ -17,6 +17,8 @@ package org.apache.solr.common.params; +import org.apache.solr.common.util.StrUtils; + /** * @since solr 1.3 */ @@ -57,7 +59,7 @@ public static TermStyle get( String p ) { if( p != null ) { - p = p.toUpperCase(); + p = p.toUpperCase(StrUtils.ROOT_LOCALE); if( p.equals( "DETAILS" ) ) { return DETAILS; } Index: solr/src/common/org/apache/solr/common/params/CoreAdminParams.java =================================================================== --- solr/src/common/org/apache/solr/common/params/CoreAdminParams.java (revision 945097) +++ solr/src/common/org/apache/solr/common/params/CoreAdminParams.java (working copy) @@ -18,6 +18,8 @@ package org.apache.solr.common.params; +import org.apache.solr.common.util.StrUtils; + /** * @since solr 1.3 */ @@ -74,7 +76,7 @@ { if( p != null ) { try { - return CoreAdminAction.valueOf( p.toUpperCase() ); + return CoreAdminAction.valueOf( p.toUpperCase(StrUtils.ROOT_LOCALE) ); } catch( Exception ex ) {} } Index: solr/src/common/org/apache/solr/common/params/FacetParams.java =================================================================== --- solr/src/common/org/apache/solr/common/params/FacetParams.java (revision 945097) +++ solr/src/common/org/apache/solr/common/params/FacetParams.java (working copy) @@ -18,6 +18,7 @@ package org.apache.solr.common.params; import org.apache.solr.common.SolrException; +import org.apache.solr.common.util.StrUtils; import java.util.EnumSet; @@ -170,10 +171,10 @@ */ public enum FacetDateOther { BEFORE, AFTER, BETWEEN, ALL, NONE; - public String toString() { return super.toString().toLowerCase(); } + public String toString() { return super.toString().toLowerCase(StrUtils.ROOT_LOCALE); } public static FacetDateOther get(String label) { try { - return valueOf(label.toUpperCase()); + return valueOf(label.toUpperCase(StrUtils.ROOT_LOCALE)); } catch (IllegalArgumentException e) { throw new SolrException (SolrException.ErrorCode.BAD_REQUEST, @@ -217,10 +218,10 @@ */ public enum FacetDateInclude { ALL, LOWER, UPPER, EDGE, OUTER; - public String toString() { return super.toString().toLowerCase(); } + public String toString() { return super.toString().toLowerCase(StrUtils.ROOT_LOCALE); } public static FacetDateInclude get(String label) { try { - return valueOf(label.toUpperCase()); + return valueOf(label.toUpperCase(StrUtils.ROOT_LOCALE)); } catch (IllegalArgumentException e) { throw new SolrException (SolrException.ErrorCode.BAD_REQUEST, Index: solr/src/common/org/apache/solr/common/params/CommonParams.java =================================================================== --- solr/src/common/org/apache/solr/common/params/CommonParams.java (revision 945097) +++ solr/src/common/org/apache/solr/common/params/CommonParams.java (working copy) @@ -17,7 +17,9 @@ package org.apache.solr.common.params; +import org.apache.solr.common.util.StrUtils; + /** * Parameters used across many handlers */ @@ -101,7 +103,7 @@ public static EchoParamStyle get( String v ) { if( v != null ) { - v = v.toUpperCase(); + v = v.toUpperCase(StrUtils.ROOT_LOCALE); if( v.equals( "EXPLICIT" ) ) { return EXPLICIT; } Index: solr/src/common/org/apache/solr/common/util/ContentStreamBase.java =================================================================== --- solr/src/common/org/apache/solr/common/util/ContentStreamBase.java (revision 945097) +++ solr/src/common/org/apache/solr/common/util/ContentStreamBase.java (working copy) @@ -51,7 +51,7 @@ public static String getCharsetFromContentType( String contentType ) { if( contentType != null ) { - int idx = contentType.toLowerCase().indexOf( "charset=" ); + int idx = contentType.toLowerCase(StrUtils.ROOT_LOCALE).indexOf( "charset=" ); if( idx > 0 ) { return contentType.substring( idx + "charset=".length() ).trim(); } Index: solr/src/common/org/apache/solr/common/util/StrUtils.java =================================================================== --- solr/src/common/org/apache/solr/common/util/StrUtils.java (revision 945097) +++ solr/src/common/org/apache/solr/common/util/StrUtils.java (working copy) @@ -20,6 +20,7 @@ import java.util.List; import java.util.ArrayList; import java.util.Collections; +import java.util.Locale; import java.io.IOException; import org.apache.solr.common.SolrException; @@ -28,6 +29,7 @@ * @version $Id$ */ public class StrUtils { + public static final Locale ROOT_LOCALE = new Locale(""); public static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; @@ -207,7 +209,7 @@ public static List toLower(List strings) { ArrayList ret = new ArrayList(strings.size()); for (String str : strings) { - ret.add(str.toLowerCase()); + ret.add(str.toLowerCase(ROOT_LOCALE)); } return ret; } Index: solr/src/solrj/org/apache/solr/client/solrj/impl/XMLResponseParser.java =================================================================== --- solr/src/solrj/org/apache/solr/client/solrj/impl/XMLResponseParser.java (revision 945097) +++ solr/src/solrj/org/apache/solr/client/solrj/impl/XMLResponseParser.java (working copy) @@ -37,6 +37,7 @@ import org.apache.solr.common.SolrException; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; +import org.apache.solr.common.util.StrUtils; /** * @@ -187,7 +188,7 @@ { if( v != null ) { try { - return KnownType.valueOf( v.toUpperCase() ); + return KnownType.valueOf( v.toUpperCase(StrUtils.ROOT_LOCALE) ); } catch( Exception ex ) {} } @@ -267,7 +268,7 @@ if( XMLStreamConstants.START_ELEMENT != parser.getEventType() ) { throw new RuntimeException( "must be start element, not: "+parser.getEventType() ); } - if( !"arr".equals( parser.getLocalName().toLowerCase() ) ) { + if( !"arr".equals( parser.getLocalName().toLowerCase(StrUtils.ROOT_LOCALE) ) ) { throw new RuntimeException( "must be 'arr', not: "+parser.getLocalName() ); } @@ -370,7 +371,7 @@ if( XMLStreamConstants.START_ELEMENT != parser.getEventType() ) { throw new RuntimeException( "must be start element, not: "+parser.getEventType() ); } - if( !"doc".equals( parser.getLocalName().toLowerCase() ) ) { + if( !"doc".equals( parser.getLocalName().toLowerCase(StrUtils.ROOT_LOCALE) ) ) { throw new RuntimeException( "must be 'lst', not: "+parser.getLocalName() ); } Index: solr/src/solrj/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java =================================================================== --- solr/src/solrj/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java (revision 945097) +++ solr/src/solrj/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java (working copy) @@ -19,6 +19,8 @@ import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.common.util.StrUtils; + import java.lang.reflect.*; import java.util.*; import java.util.regex.Pattern; @@ -178,7 +180,7 @@ } else { String setterName = setter.getName(); if (setterName.startsWith("set") && setterName.length() > 3) { - name = setterName.substring(3, 4).toLowerCase() + setterName.substring(4); + name = setterName.substring(3, 4).toLowerCase(StrUtils.ROOT_LOCALE) + setterName.substring(4); } else { name = setter.getName(); } Index: solr/src/webapp/src/org/apache/solr/servlet/cache/Method.java =================================================================== --- solr/src/webapp/src/org/apache/solr/servlet/cache/Method.java (revision 945097) +++ solr/src/webapp/src/org/apache/solr/servlet/cache/Method.java (working copy) @@ -17,12 +17,14 @@ package org.apache.solr.servlet.cache; +import org.apache.solr.common.util.StrUtils; + public enum Method { GET, POST, HEAD, OTHER; public static Method getMethod(String method) { try { - return Method.valueOf(method.toUpperCase()); + return Method.valueOf(method.toUpperCase(StrUtils.ROOT_LOCALE)); } catch (Exception e) { return OTHER; } Index: solr/src/webapp/src/org/apache/solr/servlet/SolrRequestParsers.java =================================================================== --- solr/src/webapp/src/org/apache/solr/servlet/SolrRequestParsers.java (revision 945097) +++ solr/src/webapp/src/org/apache/solr/servlet/SolrRequestParsers.java (working copy) @@ -43,6 +43,7 @@ import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.util.ContentStreamBase; +import org.apache.solr.common.util.StrUtils; import org.apache.solr.core.Config; import org.apache.solr.core.SolrCore; import org.apache.solr.request.ServletSolrParams; @@ -378,7 +379,7 @@ public SolrParams parseParamsAndFillStreams( final HttpServletRequest req, ArrayList streams ) throws Exception { - String method = req.getMethod().toUpperCase(); + String method = req.getMethod().toUpperCase(StrUtils.ROOT_LOCALE); if( "GET".equals( method ) || "HEAD".equals( method )) { return new ServletSolrParams(req); } @@ -389,7 +390,7 @@ if( idx > 0 ) { // remove the charset definition "; charset=utf-8" contentType = contentType.substring( 0, idx ); } - if( "application/x-www-form-urlencoded".equals( contentType.toLowerCase() ) ) { + if( "application/x-www-form-urlencoded".equals( contentType.toLowerCase(StrUtils.ROOT_LOCALE) ) ) { return new ServletSolrParams(req); // just get the params from parameterMap } if( ServletFileUpload.isMultipartContent(req) ) { Index: solr/src/webapp/web/admin/analysis.jsp =================================================================== --- solr/src/webapp/web/admin/analysis.jsp (revision 945097) +++ solr/src/webapp/web/admin/analysis.jsp (working copy) @@ -26,6 +26,7 @@ org.apache.solr.analysis.TokenFilterFactory, org.apache.solr.analysis.TokenizerChain, org.apache.solr.analysis.TokenizerFactory, + org.apache.solr.common.util.StrUtils, org.apache.solr.schema.FieldType, org.apache.solr.schema.SchemaField, org.apache.solr.common.util.XML, @@ -46,7 +47,7 @@ // is name a field name or a type name? String nt = request.getParameter("nt"); if (nt==null || nt.length()==0) nt="name"; // assume field name - nt = nt.toLowerCase().trim(); + nt = nt.toLowerCase(StrUtils.ROOT_LOCALE).trim(); String name = request.getParameter("name"); if (name==null || name.length()==0) name=""; String val = request.getParameter("val"); Index: lucene/src/test/org/apache/lucene/analysis/TestCharArrayMap.java =================================================================== --- lucene/src/test/org/apache/lucene/analysis/TestCharArrayMap.java (revision 945097) +++ lucene/src/test/org/apache/lucene/analysis/TestCharArrayMap.java (working copy) @@ -28,6 +28,9 @@ CharArrayMap map = new CharArrayMap(TEST_VERSION_CURRENT, 1, ignoreCase); HashMap hmap = new HashMap(); + // use the root locale for consistent behavior + final Locale rootLocale = new Locale(""); + char[] key; for (int i=0; i