use StringBuilder instead of String to avoid temporary String creation

This commit is contained in:
Hervé Boutemy 2015-09-06 09:53:24 +02:00
parent e85e8cc981
commit 2877b590f1
1 changed files with 28 additions and 22 deletions

View File

@ -149,39 +149,45 @@ protected String extrapolateChildUrl( String parentUrl, Map<Object, Object> cont
private String appendPath( String parentUrl, String childPath, String pathAdjustment )
{
String url = parentUrl;
url = concatPath( url, pathAdjustment );
url = concatPath( url, childPath );
return url;
StringBuilder url = new StringBuilder( parentUrl.length() + pathAdjustment.length() + childPath.length()
+ ( ( pathAdjustment.length() == 0 ) ? 1 : 2 ) );
url.append( parentUrl );
concatPath( url, pathAdjustment );
concatPath( url, childPath );
return url.toString();
}
private String concatPath( String base, String path )
private void concatPath( StringBuilder url, String path )
{
String result = base;
if ( path.length() > 0 )
{
boolean initialUrlEndsWithSlash = url.charAt( url.length() - 1 ) == '/';
boolean pathStartsWithSlash = path.charAt( 0 ) == '/';
if ( path != null && path.length() > 0 )
if ( pathStartsWithSlash )
{
if ( ( result.endsWith( "/" ) && !path.startsWith( "/" ) )
|| ( !result.endsWith( "/" ) && path.startsWith( "/" ) ) )
if ( initialUrlEndsWithSlash )
{
result += path;
// 1 extra '/' to remove
url.setLength( url.length() - 1 );
}
else if ( result.endsWith( "/" ) && path.startsWith( "/" ) )
{
result += path.substring( 1 );
}
else
else if ( !initialUrlEndsWithSlash )
{
result += '/';
result += path;
}
if ( base.endsWith( "/" ) && !result.endsWith( "/" ) )
{
result += '/';
}
// add missing '/' between url and path
url.append( '/' );
}
return result;
url.append( path );
// ensure resulting url ends with slash if initial url was
if ( initialUrlEndsWithSlash && !path.endsWith( "/" ) )
{
url.append( '/' );
}
}
}
@Override