@ -54,7 +54,7 @@ import org.springframework.web.util.HierarchicalUriComponents.PathComponent;
@@ -54,7 +54,7 @@ import org.springframework.web.util.HierarchicalUriComponents.PathComponent;
* @see # fromPath ( String )
* @see # fromUri ( URI )
* /
public class UriComponentsBuilder {
public class UriComponentsBuilder implements Cloneable {
private static final Pattern QUERY_PARAM_PATTERN = Pattern . compile ( "([^&=]+)(=?)([^&]+)?" ) ;
@ -98,7 +98,7 @@ public class UriComponentsBuilder {
@@ -98,7 +98,7 @@ public class UriComponentsBuilder {
private String port ;
private CompositePathComponentBuilder pathBuilder = new CompositePathComponentBuilder ( ) ;
private CompositePathComponentBuilder pathBuilder ;
private final MultiValueMap < String , String > queryParams = new LinkedMultiValueMap < String , String > ( ) ;
@ -112,6 +112,22 @@ public class UriComponentsBuilder {
@@ -112,6 +112,22 @@ public class UriComponentsBuilder {
* @see # fromUri ( URI )
* /
protected UriComponentsBuilder ( ) {
this . pathBuilder = new CompositePathComponentBuilder ( ) ;
}
/ * *
* Create a deep copy of the given UriComponentsBuilder .
* @param other the other builder to copy from
* /
protected UriComponentsBuilder ( UriComponentsBuilder other ) {
this . scheme = other . scheme ;
this . ssp = other . ssp ;
this . userInfo = other . userInfo ;
this . host = other . host ;
this . port = other . port ;
this . pathBuilder = ( CompositePathComponentBuilder ) other . pathBuilder . clone ( ) ;
this . queryParams . putAll ( other . queryParams ) ;
this . fragment = other . fragment ;
}
@ -627,16 +643,23 @@ public class UriComponentsBuilder {
@@ -627,16 +643,23 @@ public class UriComponentsBuilder {
return this ;
}
@Override
protected Object clone ( ) {
return new UriComponentsBuilder ( this ) ;
}
private interface PathComponentBuilder {
private interface PathComponentBuilder extends Cloneable {
PathComponent build ( ) ;
Object clone ( ) ;
}
private static class CompositePathComponentBuilder implements PathComponentBuilder {
private final LinkedList < PathComponentBuilder > componentB uilders = new LinkedList < PathComponentBuilder > ( ) ;
private final LinkedList < PathComponentBuilder > b uilders = new LinkedList < PathComponentBuilder > ( ) ;
public CompositePathComponentBuilder ( ) {
}
@ -651,7 +674,7 @@ public class UriComponentsBuilder {
@@ -651,7 +674,7 @@ public class UriComponentsBuilder {
FullPathComponentBuilder fpBuilder = getLastBuilder ( FullPathComponentBuilder . class ) ;
if ( psBuilder = = null ) {
psBuilder = new PathSegmentComponentBuilder ( ) ;
this . componentB uilders. add ( psBuilder ) ;
this . b uilders. add ( psBuilder ) ;
if ( fpBuilder ! = null ) {
fpBuilder . removeTrailingSlash ( ) ;
}
@ -669,7 +692,7 @@ public class UriComponentsBuilder {
@@ -669,7 +692,7 @@ public class UriComponentsBuilder {
}
if ( fpBuilder = = null ) {
fpBuilder = new FullPathComponentBuilder ( ) ;
this . componentB uilders. add ( fpBuilder ) ;
this . b uilders. add ( fpBuilder ) ;
}
fpBuilder . append ( path ) ;
}
@ -677,8 +700,8 @@ public class UriComponentsBuilder {
@@ -677,8 +700,8 @@ public class UriComponentsBuilder {
@SuppressWarnings ( "unchecked" )
private < T > T getLastBuilder ( Class < T > builderClass ) {
if ( ! this . componentB uilders. isEmpty ( ) ) {
PathComponentBuilder last = this . componentB uilders. getLast ( ) ;
if ( ! this . b uilders. isEmpty ( ) ) {
PathComponentBuilder last = this . b uilders. getLast ( ) ;
if ( builderClass . isInstance ( last ) ) {
return ( T ) last ;
}
@ -688,9 +711,9 @@ public class UriComponentsBuilder {
@@ -688,9 +711,9 @@ public class UriComponentsBuilder {
@Override
public PathComponent build ( ) {
int size = this . componentB uilders. size ( ) ;
int size = this . b uilders. size ( ) ;
List < PathComponent > components = new ArrayList < PathComponent > ( size ) ;
for ( PathComponentBuilder componentBuilder : this . componentB uilders) {
for ( PathComponentBuilder componentBuilder : this . b uilders) {
PathComponent pathComponent = componentBuilder . build ( ) ;
if ( pathComponent ! = null ) {
components . add ( pathComponent ) ;
@ -704,6 +727,15 @@ public class UriComponentsBuilder {
@@ -704,6 +727,15 @@ public class UriComponentsBuilder {
}
return new HierarchicalUriComponents . PathComponentComposite ( components ) ;
}
@Override
public Object clone ( ) {
CompositePathComponentBuilder compositeBuilder = new CompositePathComponentBuilder ( ) ;
for ( PathComponentBuilder builder : this . builders ) {
compositeBuilder . builders . add ( ( PathComponentBuilder ) builder . clone ( ) ) ;
}
return compositeBuilder ;
}
}
@ -737,6 +769,13 @@ public class UriComponentsBuilder {
@@ -737,6 +769,13 @@ public class UriComponentsBuilder {
this . path . deleteCharAt ( index ) ;
}
}
@Override
public Object clone ( ) {
FullPathComponentBuilder builder = new FullPathComponentBuilder ( ) ;
builder . append ( this . path . toString ( ) ) ;
return builder ;
}
}
@ -757,6 +796,13 @@ public class UriComponentsBuilder {
@@ -757,6 +796,13 @@ public class UriComponentsBuilder {
return ( this . pathSegments . isEmpty ( ) ? null :
new HierarchicalUriComponents . PathSegmentComponent ( this . pathSegments ) ) ;
}
@Override
public Object clone ( ) {
PathSegmentComponentBuilder builder = new PathSegmentComponentBuilder ( ) ;
builder . pathSegments . addAll ( this . pathSegments ) ;
return builder ;
}
}
}