Skip to content

Commit 0aa9b10

Browse files
apiUrl should be able to apply path #10699
1 parent cc64371 commit 0aa9b10

File tree

8 files changed

+67
-32
lines changed

8 files changed

+67
-32
lines changed

modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ApiUrlHandler.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,44 @@
11
package com.enonic.xp.lib.portal.url;
22

3+
import java.util.List;
34
import java.util.Set;
45

56
import com.google.common.collect.Multimap;
67

78
import com.enonic.xp.portal.url.ApiUrlParams;
9+
import com.enonic.xp.script.ScriptValue;
810

911
public final class ApiUrlHandler
1012
extends AbstractUrlHandler
1113
{
1214
private static final Set<String> VALID_URL_PROPERTY_KEYS = Set.of( "application", "api", "type", "params" );
1315

14-
private Object path;
16+
private String path;
17+
18+
private List<String> pathSegments;
1519

1620
@Override
1721
protected String buildUrl( final Multimap<String, String> map )
1822
{
19-
final ApiUrlParams params = new ApiUrlParams().portalRequest( this.request ).setAsMap( map ).path( this.path );
23+
final ApiUrlParams params =
24+
new ApiUrlParams().portalRequest( this.request ).setAsMap( map ).path( this.path ).pathSegments( this.pathSegments );
2025
return this.urlService.apiUrl( params );
2126
}
2227

23-
public void setPath( final Object path )
28+
public void setPath( final Object value )
2429
{
25-
this.path = path;
30+
if ( value instanceof ScriptValue && ( (ScriptValue) value ).isArray() )
31+
{
32+
this.pathSegments = ( (ScriptValue) value ).getArray( String.class );
33+
}
34+
else if ( value instanceof String )
35+
{
36+
this.path = (String) value;
37+
}
38+
else
39+
{
40+
throw new IllegalArgumentException( "Invalid path value" );
41+
}
2642
}
2743

2844
@Override

modules/lib/lib-portal/src/main/resources/lib/xp/examples/portal/apiUrl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ const apiUrl = portalLib.apiUrl({
2525
// END
2626

2727
assert.assertEquals('ApiUrlParams{type=server, params={a=[1], b=[2]}, api=myapi, application=com.enonic.app.myapp, path=mypath/subpath}', url);
28-
assert.assertEquals('ApiUrlParams{type=server, params={}, application=com.enonic.app.myapp, path=[mypath, myotherpath]}', unnamedApiUrl);
28+
assert.assertEquals('ApiUrlParams{type=server, params={}, application=com.enonic.app.myapp, pathSegments=[mypath, myotherpath]}', unnamedApiUrl);
2929
assert.assertEquals('ApiUrlParams{type=server, params={}, api=myapi, application=com.enonic.app.myapp}', apiUrl);

modules/lib/lib-portal/src/main/resources/lib/xp/portal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ export function apiUrl(urlParams: ApiUrlParams): string {
650650
const bean = __.newBean<ApiUrlHandler>('com.enonic.xp.lib.portal.url.ApiUrlHandler');
651651
if (path) {
652652
if (Array.isArray(path)) {
653-
bean.setPath(__.toScriptValue(([] as string[]).concat(path)));
653+
bean.setPath(__.toScriptValue(path));
654654
} else {
655655
bean.setPath(path as string);
656656
}

modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ApiUrlParams.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.enonic.xp.portal.url;
22

3+
import java.util.List;
34
import java.util.Objects;
45

56
import com.google.common.base.MoreObjects;
67
import com.google.common.base.Strings;
78
import com.google.common.collect.Multimap;
89

910
import com.enonic.xp.annotation.PublicApi;
10-
import com.enonic.xp.script.ScriptValue;
1111

1212
@PublicApi
1313
public final class ApiUrlParams
@@ -17,7 +17,9 @@ public final class ApiUrlParams
1717

1818
private String api;
1919

20-
private Object path;
20+
private String path;
21+
22+
private List<String> pathSegments;
2123

2224
public String getApplication()
2325
{
@@ -29,11 +31,16 @@ public String getApi()
2931
return api;
3032
}
3133

32-
public Object getPath()
34+
public String getPath()
3335
{
3436
return path;
3537
}
3638

39+
public List<String> getPathSegments()
40+
{
41+
return pathSegments;
42+
}
43+
3744
public ApiUrlParams application( final String value )
3845
{
3946
this.application = Objects.requireNonNull( value );
@@ -46,16 +53,15 @@ public ApiUrlParams api( final String value )
4653
return this;
4754
}
4855

49-
public ApiUrlParams path( final Object value )
56+
public ApiUrlParams path( final String value )
57+
{
58+
this.path = value;
59+
return this;
60+
}
61+
62+
public ApiUrlParams pathSegments( final List<String> pathSegments )
5063
{
51-
if ( value instanceof ScriptValue && ( (ScriptValue) value ).isArray() )
52-
{
53-
this.path = ( (ScriptValue) value ).getArray( String.class );
54-
}
55-
else
56-
{
57-
this.path = value;
58-
}
64+
this.pathSegments = pathSegments;
5965
return this;
6066
}
6167

@@ -76,5 +82,6 @@ protected void buildToString( final MoreObjects.ToStringHelper helper )
7682
helper.add( "api", this.api );
7783
helper.add( "application", this.application );
7884
helper.add( "path", this.path );
85+
helper.add( "pathSegments", this.pathSegments );
7986
}
8087
}

modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/SlashApiUrlBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendParams;
66
import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendPart;
7+
import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendPathSegments;
78
import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendSubPath;
89

910
public class SlashApiUrlBuilder
@@ -25,6 +26,7 @@ public String build()
2526
appendPart( url, params.getApi() );
2627
}
2728
appendSubPath( url, this.params.getPath() );
29+
appendPathSegments( url, this.params.getPathSegments() );
2830
appendParams( url, params.getParams().entries() );
2931
return url.toString();
3032
}

modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/UniversalApiUrlBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.enonic.xp.portal.url.ApiUrlParams;
1111
import com.enonic.xp.site.Site;
1212

13+
import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendPathSegments;
1314
import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendSubPath;
1415

1516
final class UniversalApiUrlBuilder
@@ -79,6 +80,7 @@ else if ( requestURI.startsWith( WEBAPP_PREFIX ) )
7980
appendPart( url, this.params.getApi() );
8081
}
8182
appendSubPath( url, this.params.getPath() );
83+
appendPathSegments( url, this.params.getPathSegments() );
8284

8385
params.putAll( this.params.getParams() );
8486
}

modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/UrlBuilderHelper.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,24 @@ public static void appendPartWithoutNormalization( final StringBuilder str, fina
5252
str.append( urlPart );
5353
}
5454

55-
public static void appendSubPath( final StringBuilder url, final Object subPath )
55+
public static void appendPathSegments( final StringBuilder url, final Collection<String> pathSegments )
5656
{
57-
if ( subPath != null )
57+
if ( pathSegments != null )
5858
{
59-
if ( subPath instanceof Collection )
60-
{
61-
( (Collection<?>) subPath ).forEach( pathPart -> appendPart( url, (String) pathPart ) );
62-
}
63-
else
64-
{
65-
appendPartWithoutNormalization( url, subPath.toString() );
66-
}
59+
pathSegments.forEach( pathSegment -> {
60+
if ( !isNullOrEmpty( pathSegment ) )
61+
{
62+
appendPart( url, pathSegment );
63+
}
64+
} );
65+
}
66+
}
67+
68+
public static void appendSubPath( final StringBuilder url, final String subPath )
69+
{
70+
if ( !isNullOrEmpty( subPath ) )
71+
{
72+
appendPartWithoutNormalization( url, subPath );
6773
}
6874
}
6975

modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl_apiUrlTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,12 @@ void testCreateUrlWithoutPortalRequest()
100100
params.api( "myapi" );
101101
params.param( "k1", "v1" );
102102
params.param( "k2", "v2" );
103-
params.path( List.of( "språk", "kurs" ) );
103+
params.pathSegments( List.of( "språk", "kurs" ) );
104104

105-
final String url = this.service.apiUrl( params );
106-
assertEquals( "/api/com.enonic.app.myapp/myapi/spr%C3%A5k/kurs?k1=v1&k2=v2", url );
105+
assertEquals( "/api/com.enonic.app.myapp/myapi/spr%C3%A5k/kurs?k1=v1&k2=v2", this.service.apiUrl( params ) );
106+
107+
params.path( "språk/kurs" ) ;
108+
assertEquals( "/api/com.enonic.app.myapp/myapi/språk/kurs/spr%C3%A5k/kurs?k1=v1&k2=v2", this.service.apiUrl( params ) );
107109
}
108110

109111
@Test
@@ -156,7 +158,7 @@ void testCreateUrlApi()
156158
params.portalRequest( this.portalRequest );
157159
params.application( "myapp2" );
158160
params.api( "api2" );
159-
params.path( List.of( "språk", "kurs" ) );
161+
params.pathSegments( List.of( "språk", "kurs" ) );
160162

161163
final String url = this.service.apiUrl( params );
162164
assertEquals( "/api/myapp2/api2/spr%C3%A5k/kurs", url );

0 commit comments

Comments
 (0)