diff --git a/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/AttachmentMediaUrlHandler.java b/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/AttachmentMediaUrlHandler.java index 77b19a82f9b..bb8c1077695 100644 --- a/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/AttachmentMediaUrlHandler.java +++ b/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/AttachmentMediaUrlHandler.java @@ -135,6 +135,8 @@ public String createUrl() .webRequest( this.requestSupplier.get() ) .build(); - return this.urlServiceSupplier.get().attachmentMediaUrl( params ); + return null; + +// return this.urlServiceSupplier.get().attachmentMediaUrl( params ); } } diff --git a/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageMediaUrlHandler.java b/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageMediaUrlHandler.java index 9466f87a80b..2fff3dcb4b2 100644 --- a/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageMediaUrlHandler.java +++ b/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageMediaUrlHandler.java @@ -151,7 +151,8 @@ public String createUrl() .branch( this.branch ) .build(); - return urlServiceSupplier.get().imageMediaUrl( imageMediaUrlParams ); + return null; +// return urlServiceSupplier.get().imageMediaUrl( imageMediaUrlParams ); } } diff --git a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlGeneratorParams.java b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlGeneratorParams.java index 61c3d0158ec..64059353872 100644 --- a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlGeneratorParams.java +++ b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlGeneratorParams.java @@ -5,7 +5,6 @@ import com.enonic.xp.branch.Branch; import com.enonic.xp.content.Media; import com.enonic.xp.project.ProjectName; -import com.enonic.xp.site.Site; public class ImageUrlGeneratorParams { @@ -15,8 +14,6 @@ public class ImageUrlGeneratorParams public RewritePathStrategy rewritePathStrategy; - public Supplier nearestSiteProvider; - public Supplier mediaProvider; public ProjectName projectName; @@ -25,10 +22,6 @@ public class ImageUrlGeneratorParams public String scale; - public String id; - - public String path; - public String background; public Integer quality; diff --git a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlParams.java b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlParams.java index 541880a1694..b7243db2fe2 100644 --- a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlParams.java +++ b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/ImageUrlParams.java @@ -31,7 +31,7 @@ public final class ImageUrlParams private String branch; - private String siteKey; + private String contentKey; public String getId() { @@ -78,9 +78,9 @@ public String getBranch() return branch; } - public String getSiteKey() + public String getContentKey() { - return siteKey; + return contentKey; } public ImageUrlParams id( final String value ) @@ -142,9 +142,9 @@ public ImageUrlParams branch( final String branch ) return this; } - public ImageUrlParams siteKey( final String siteKey ) + public ImageUrlParams contentKey( final String contentKey ) { - this.siteKey = siteKey; + this.contentKey = contentKey; return this; } diff --git a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/PortalUrlService.java b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/PortalUrlService.java index da991b1627e..521edd254ad 100644 --- a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/PortalUrlService.java +++ b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/PortalUrlService.java @@ -25,9 +25,5 @@ public interface PortalUrlService String apiUrl( ApiUrlParams params ); - String imageMediaUrl( ImageMediaUrlParams params ); - - String attachmentMediaUrl( AttachmentMediaUrlParams params ); - String imageUrl( ImageUrlGeneratorParams params ); } diff --git a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/UrlStrategyFacade.java b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/UrlStrategyFacade.java index 9b3838fef5e..e5e6bcf5ab7 100644 --- a/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/UrlStrategyFacade.java +++ b/modules/portal/portal-api/src/main/java/com/enonic/xp/portal/url/UrlStrategyFacade.java @@ -1,17 +1,13 @@ package com.enonic.xp.portal.url; import com.enonic.xp.branch.Branch; +import com.enonic.xp.content.Content; import com.enonic.xp.portal.PortalRequest; import com.enonic.xp.project.ProjectName; public interface UrlStrategyFacade { - PathPrefixStrategy requestPathPrefixStrategy( final PortalRequest portalRequest ); - - PathPrefixStrategy contextPathPrefixStrategy( final ProjectName projectName, - final Branch branch, final String contentKey ); - - BaseUrlStrategy offlineBaseUrlStrategy( final ProjectName projectName, final Branch branch, final String siteKey ); + BaseUrlStrategy offlineBaseUrlStrategy( final ProjectName projectName, final Branch branch, final Content content ); BaseUrlStrategy requestBaseUrlStrategy( final PortalRequest portalRequest, final String urlType ); diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/idprovider/PortalRequestAdapter.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/idprovider/PortalRequestAdapter.java index efe0268c9f0..7f34d3455bb 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/idprovider/PortalRequestAdapter.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/idprovider/PortalRequestAdapter.java @@ -175,6 +175,10 @@ else if ( requestURI.startsWith( WEBAPP_PREFIX ) ) result.setBaseUri( WEBAPP_PREFIX + matcher.group( 0 ) ); } } + else if ( requestURI.startsWith( "/api/" ) ) + { + result.setBaseUri( "/api" ); + } } private static String subPath( String requestURI, String prefix ) diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl.java index 58958e64529..16887939a21 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl.java @@ -13,10 +13,10 @@ import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.context.ContextBuilder; import com.enonic.xp.macro.MacroService; +import com.enonic.xp.portal.PortalRequest; +import com.enonic.xp.portal.PortalRequestAccessor; import com.enonic.xp.portal.impl.PortalConfig; import com.enonic.xp.portal.impl.RedirectChecksumService; -import com.enonic.xp.portal.impl.url3.MediaService; -import com.enonic.xp.portal.impl.url3.UrlGenerator; import com.enonic.xp.portal.impl.url3.UrlService; import com.enonic.xp.portal.url.AbstractUrlParams; import com.enonic.xp.portal.url.ApiUrlParams; @@ -26,13 +26,13 @@ import com.enonic.xp.portal.url.ComponentUrlParams; import com.enonic.xp.portal.url.GenerateUrlParams; import com.enonic.xp.portal.url.IdentityUrlParams; -import com.enonic.xp.portal.url.ImageMediaUrlParams; import com.enonic.xp.portal.url.ImageUrlGeneratorParams; import com.enonic.xp.portal.url.ImageUrlParams; import com.enonic.xp.portal.url.PageUrlParams; import com.enonic.xp.portal.url.PortalUrlService; import com.enonic.xp.portal.url.ProcessHtmlParams; import com.enonic.xp.portal.url.ServiceUrlParams; +import com.enonic.xp.portal.url.UrlStrategyFacade; import com.enonic.xp.resource.ResourceService; import com.enonic.xp.security.RoleKeys; import com.enonic.xp.security.auth.AuthenticationInfo; @@ -52,7 +52,7 @@ public final class PortalUrlServiceImpl private final RedirectChecksumService redirectChecksumService; - private final MediaService mediaService; + private final UrlStrategyFacade urlStrategyFacade; private volatile boolean legacyImageServiceEnabled; @@ -65,14 +65,15 @@ public final class PortalUrlServiceImpl @Activate public PortalUrlServiceImpl( @Reference final ContentService contentService, @Reference final ResourceService resourceService, @Reference final MacroService macroService, @Reference final StyleDescriptorService styleDescriptorService, - @Reference final RedirectChecksumService redirectChecksumService, @Reference final MediaService mediaService ) + @Reference final RedirectChecksumService redirectChecksumService, + @Reference final UrlStrategyFacade urlStrategyFacade ) { this.contentService = contentService; this.resourceService = resourceService; this.macroService = macroService; this.styleDescriptorService = styleDescriptorService; this.redirectChecksumService = redirectChecksumService; - this.mediaService = mediaService; + this.urlStrategyFacade = urlStrategyFacade; } @Activate @@ -122,24 +123,13 @@ public String imageUrl( final ImageUrlParams params ) } else { - final ImageMediaUrlParams imageMediaUrlParams = ImageMediaUrlParams.create() - .contentId( params.getId() ) - .contentPath( params.getPath() ) - .contextPathType( params.getContextPathType() ) - .webRequest( params.getPortalRequest() ) - .urlType( params.getType() ) - .addQueryParams( params.getParams() ) - .background( params.getBackground() ) - .scale( params.getScale() ) - .filter( params.getFilter() ) - .quality( params.getQuality() ) - .format( params.getFormat() ) - .projectName( null ) - .branch( null ) - .siteKey( null ) - .build(); - - return imageMediaUrl( imageMediaUrlParams ); + final PortalRequest portalRequest = PortalRequestAccessor.get(); + + final ImageUrlGeneratorParams generatorParams = portalRequest == null + ? urlStrategyFacade.offlineImageUrlParams( params ) + : urlStrategyFacade.requestImageUrlParams( params ); + + return imageUrl( generatorParams ); } } @@ -154,21 +144,23 @@ public String attachmentUrl( final AttachmentUrlParams params ) } else { - final AttachmentMediaUrlParams attachmentMediaUrlParams = AttachmentMediaUrlParams.create() - .contentId( params.getId() ) - .contentPath( params.getPath() ) - .contextPathType( params.getContextPathType() ) - .urlType( params.getType() ) - .webRequest( params.getPortalRequest() ) - .addQueryParams( params.getParams() ) - .download( params.isDownload() ) - .name( params.getName() ) - .label( params.getLabel() ) - .projectName( null ) - .branch( null ) - .build(); - - return attachmentMediaUrl( attachmentMediaUrlParams ); +// final AttachmentMediaUrlParams attachmentMediaUrlParams = AttachmentMediaUrlParams.create() +// .contentId( params.getId() ) +// .contentPath( params.getPath() ) +// .contextPathType( params.getContextPathType() ) +// .urlType( params.getType() ) +// .webRequest( params.getPortalRequest() ) +// .addQueryParams( params.getParams() ) +// .download( params.isDownload() ) +// .name( params.getName() ) +// .label( params.getLabel() ) +// .projectName( null ) +// .branch( null ) +// .build(); +// +// return attachmentMediaUrl( attachmentMediaUrlParams ); + + return ""; } } @@ -210,19 +202,6 @@ public String apiUrl( final ApiUrlParams params ) } } - @Override - public String imageMediaUrl( final ImageMediaUrlParams params ) - { - return runWithAdminRole( () -> mediaService.imageMediaUrl( params ) ); - } - - @Override - public String attachmentMediaUrl( final AttachmentMediaUrlParams params ) - { - return null; -// return runWithAdminRole( () -> mediaService.imageMediaUrl( params ) ); - } - @Override public String imageUrl( final ImageUrlGeneratorParams params ) { diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlService.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlService.java index 7a5e2b4fac7..91ec1ff8895 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlService.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlService.java @@ -25,14 +25,4 @@ public String imageUrl( com.enonic.xp.portal.url.ImageUrlGeneratorParams params return UrlGenerator.generateUrl( baseUrlStrategy, mediaPathStrategy, rewritePathStrategy ); } - private ImageMediaPathStrategyParams map( final ImageUrlGeneratorParams source ) - { - return ImageMediaPathStrategyParams.create() - .setMedia( source.getMedia() ) - .setProjectName( source.getProjectName() ) - .setBranch( source.getBranch() ) - .setScale( source.getScale() ) - .build(); - } - } diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlStrategyFacadeImpl.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlStrategyFacadeImpl.java index 51fe328c99a..73e6eeb14dd 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlStrategyFacadeImpl.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlStrategyFacadeImpl.java @@ -9,11 +9,11 @@ import com.enonic.xp.app.ApplicationKey; import com.enonic.xp.branch.Branch; import com.enonic.xp.content.Content; +import com.enonic.xp.content.ContentConstants; import com.enonic.xp.content.ContentId; import com.enonic.xp.content.ContentPath; import com.enonic.xp.content.ContentService; import com.enonic.xp.content.Media; -import com.enonic.xp.context.Context; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.context.ContextBuilder; import com.enonic.xp.exception.NotFoundException; @@ -26,9 +26,14 @@ import com.enonic.xp.portal.url.PathPrefixStrategy; import com.enonic.xp.portal.url.RewritePathStrategy; import com.enonic.xp.portal.url.UrlStrategyFacade; +import com.enonic.xp.project.Project; import com.enonic.xp.project.ProjectName; +import com.enonic.xp.project.ProjectService; import com.enonic.xp.site.Site; import com.enonic.xp.site.SiteConfig; +import com.enonic.xp.site.SiteConfigs; + +import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendPart; @Component(immediate = true, service = UrlStrategyFacade.class) public class UrlStrategyFacadeImpl @@ -37,55 +42,60 @@ public class UrlStrategyFacadeImpl private final ContentService contentService; + private final ProjectService projectService; + @Activate - public UrlStrategyFacadeImpl( @Reference final ContentService contentService ) + public UrlStrategyFacadeImpl( @Reference final ContentService contentService, @Reference final ProjectService projectService ) { this.contentService = contentService; + this.projectService = projectService; } - @Override - public PathPrefixStrategy requestPathPrefixStrategy( final PortalRequest portalRequest ) + private String resolveBaseUrl( final SiteConfigs siteConfigs ) { - return new HarmonizedApiPathPrefixStrategy( - HarmonizedApiPathPrefixStrategyParams.create().setPortalRequest( portalRequest ).build() ); - } - - @Override - public PathPrefixStrategy contextPathPrefixStrategy( final ProjectName projectName, final Branch branch, final String contentKey ) - { - - return new HarmonizedApiPathPrefixStrategy( HarmonizedApiPathPrefixStrategyParams.create() - .setProjectName( projectName ) - .setBranch( branch ) - .setContentKey( contentKey ) - .build() ); + SiteConfig siteConfig = siteConfigs.get( ApplicationKey.from( "com.enonic.xp.site" ) ); + if ( siteConfig != null ) + { + return siteConfig.getConfig().getString( "baseUrl" ); + } + return null; } @Override - public BaseUrlStrategy offlineBaseUrlStrategy( final ProjectName projectName, final Branch branch, final String siteKey ) - { - Context context = - ContextBuilder.copyOf( ContextAccessor.current() ).repositoryId( projectName.getRepoId() ).branch( branch ).build(); - - Content content = context.callWith( () -> getContent( siteKey ) ); + public BaseUrlStrategy offlineBaseUrlStrategy(final ProjectName projectName, final Branch branch, final Content content) { + if (content == null) { + return () -> "/"; + } - if ( !( content instanceof Site site ) ) - { - throw new NotFoundException( String.format( "Site [%s] not find", siteKey ) ) - { - }; + if (content instanceof Site site) { + String baseUrl = resolveBaseUrl(site.getSiteConfigs()); + if (baseUrl != null) { + return () -> baseUrl; + } } - SiteConfig siteConfig = site.getSiteConfigs().get( ApplicationKey.from( "com.enonic.xp.site" ) ); - if ( siteConfig != null ) - { - String baseUrl = siteConfig.getConfig().getString( "baseUrl" ); - return () -> Objects.requireNonNullElse( baseUrl, "/" ); + Site nearestSite = ContextBuilder.copyOf( ContextAccessor.current() ) + .repositoryId( projectName.getRepoId() ) + .branch( branch ) + .build() + .callWith( () -> contentService.getNearestSite( ContentId.from( content.getId() ) ) ); + + if (nearestSite != null) { + String baseUrl = resolveBaseUrl(nearestSite.getSiteConfigs()); + if (baseUrl != null) { + return () -> baseUrl; + } } - else - { - return () -> "/"; + + Project project = projectService.get( projectName); + if (project != null) { + String baseUrl = resolveBaseUrl(project.getSiteConfigs()); + if (baseUrl != null) { + return () -> baseUrl; + } } + + return () -> "/"; } @Override @@ -109,46 +119,71 @@ public RewritePathStrategy doNotRewriteStrategy() @Override public ImageUrlGeneratorParams offlineImageUrlParams( final ImageUrlParams params ) { - final ProjectName mainPathProjectName = params.getProjectName() != null + final ProjectName mediaPathProjectName = params.getProjectName() != null ? ProjectName.from( params.getProjectName() ) - : ProjectName.from( ContextAccessor.current().getRepositoryId() ); + : ProjectName.from( Objects.requireNonNull( ContextAccessor.current().getRepositoryId() ) ); - final Branch mainPathBranch = params.getBranch() != null ? Branch.from( params.getBranch() ) : ContextAccessor.current().getBranch(); + final Branch mediaPathBranch = params.getBranch() != null + ? Branch.from( params.getBranch() ) + : Objects.requireNonNullElse( ContextAccessor.current().getBranch(), ContentConstants.BRANCH_MASTER ); final ProjectName prefixAndBaseUrlProjectName = ContextAccessor.current().getRepositoryId() != null ? ProjectName.from( ContextAccessor.current().getRepositoryId() ) - : ProjectName.from( params.getProjectName() ); + : ProjectName.from( Objects.requireNonNull( params.getProjectName() ) ); final Branch prefixAndBaseUrlBranch = ContextAccessor.current().getBranch() != null ? ContextAccessor.current().getBranch() - : Branch.from( params.getBranch() ); + : Objects.requireNonNullElse( Branch.from( params.getBranch() ), ContentConstants.BRANCH_MASTER ); + + final String contentKey = params.getContentKey(); - final String siteKey = params.getSiteKey(); + final Media media = ContextBuilder.copyOf( ContextAccessor.current() ) + .repositoryId( mediaPathProjectName.getRepoId() ) + .branch( mediaPathBranch ) + .build() + .callWith( () -> getMedia( Objects.requireNonNullElse( params.getId(), params.getPath() ) ) ); - BaseUrlStrategy baseUrlStrategy = offlineBaseUrlStrategy( prefixAndBaseUrlProjectName, prefixAndBaseUrlBranch, siteKey ); + final Site site = ContextBuilder.copyOf( ContextAccessor.current() ) + .repositoryId( prefixAndBaseUrlProjectName.getRepoId() ) + .branch( prefixAndBaseUrlBranch ) + .build() + .callWith( () -> contentKey.startsWith( "/" ) + ? contentService.findNearestSiteByPath( ContentPath.from( contentKey ) ) + : contentService.getNearestSite( ContentId.from( contentKey ) ) ); - PathPrefixStrategy pathPrefixStrategy = contextPathPrefixStrategy( mainPathProjectName, mainPathBranch, siteKey ); + final BaseUrlStrategy baseUrlStrategy = offlineBaseUrlStrategy( prefixAndBaseUrlProjectName, prefixAndBaseUrlBranch, site ); - RewritePathStrategy rewritePathStrategy = doNotRewriteStrategy(); + final PathPrefixStrategy pathPrefixStrategy = contentKey == null ? () -> "/api" : () -> { + final StringBuilder prefix = new StringBuilder(); - Context context = - ContextBuilder.copyOf( ContextAccessor.current() ).repositoryId( mainPathProjectName.getRepoId() ).branch( mainPathBranch ).build(); + appendPart( prefix, "site" ); + appendPart( prefix, prefixAndBaseUrlProjectName.toString() ); + appendPart( prefix, prefixAndBaseUrlBranch.getValue() ); + if ( site != null ) + { + appendPart( prefix, site.getPath().toString() ); + } + appendPart( prefix, "_" ); + return prefix.toString(); + }; - ImageUrlGeneratorParams generatorParams = new ImageUrlGeneratorParams(); + final RewritePathStrategy rewritePathStrategy = doNotRewriteStrategy(); + + final ImageUrlGeneratorParams generatorParams = new ImageUrlGeneratorParams(); generatorParams.baseUrlStrategy = baseUrlStrategy; generatorParams.pathPrefixStrategy = pathPrefixStrategy; generatorParams.rewritePathStrategy = rewritePathStrategy; - generatorParams.mediaProvider = - () -> context.callWith( () -> getMedia( Objects.requireNonNullElse( params.getId(), params.getPath() ) ) ); - generatorParams.nearestSiteProvider = () -> null; // TODO + + generatorParams.mediaProvider = () -> media; + + generatorParams.projectName = mediaPathProjectName; + generatorParams.branch = mediaPathBranch; generatorParams.scale = params.getScale(); generatorParams.format = params.getFormat(); generatorParams.filter = params.getFilter(); generatorParams.quality = params.getQuality(); generatorParams.background = params.getBackground(); - generatorParams.id = params.getId(); - generatorParams.path = params.getPath(); return generatorParams; } @@ -158,36 +193,76 @@ public ImageUrlGeneratorParams requestImageUrlParams( final ImageUrlParams param { final PortalRequest portalRequest = PortalRequestAccessor.get(); - BaseUrlStrategy baseUrlStrategy = requestBaseUrlStrategy( portalRequest, params.getType() ); + final ProjectName mediaPathProjectName = params.getProjectName() != null + ? ProjectName.from( params.getProjectName() ) + : ProjectName.from( Objects.requireNonNull( portalRequest.getRepositoryId(), "Project must be provided" ) ); - PathPrefixStrategy pathPrefixStrategy = requestPathPrefixStrategy( portalRequest ); + final Branch mediaPathBranch = params.getBranch() != null + ? Branch.from( params.getBranch() ) + : Objects.requireNonNullElse( portalRequest.getBranch(), ContentConstants.BRANCH_MASTER ); - RewritePathStrategy rewritePathStrategy = requestRewriteStrategy( portalRequest ); + final ProjectName prefixAndBaseUrlProjectName = portalRequest.getRepositoryId() != null + ? ProjectName.from( portalRequest.getRepositoryId() ) + : ProjectName.from( params.getProjectName() ); - Context context = ContextBuilder.copyOf( ContextAccessor.current() ) - .repositoryId( portalRequest.getRepositoryId() ) - .branch( portalRequest.getBranch() ) - .build(); + final Branch prefixAndBaseUrlBranch = portalRequest.getBranch() != null + ? portalRequest.getBranch() + : Branch.from( Objects.requireNonNullElse( params.getBranch(), ContentConstants.BRANCH_MASTER.getValue() ) ); - ImageUrlGeneratorParams generatorParams = new ImageUrlGeneratorParams(); + final Media media = ContextBuilder.copyOf( ContextAccessor.current() ) + .repositoryId( mediaPathProjectName.getRepoId() ) + .branch( mediaPathBranch ) + .build() + .callWith( () -> getMedia( Objects.requireNonNullElse( params.getId(), params.getPath() ) ) ); + + final Site site = ContextBuilder.copyOf( ContextAccessor.current() ) + .repositoryId( prefixAndBaseUrlProjectName.getRepoId() ) + .branch( prefixAndBaseUrlBranch ) + .build() + .callWith( () -> { + final ContentResolver contentResolver = new ContentResolver( contentService ); + return contentResolver.resolve( portalRequest ).getNearestSite(); + } ); + + final BaseUrlStrategy baseUrlStrategy = requestBaseUrlStrategy( portalRequest, params.getType() ); + + final PathPrefixStrategy pathPrefixStrategy = () -> { + final StringBuilder prefix = new StringBuilder(); + + appendPart( prefix, portalRequest.getBaseUri() ); + if ( portalRequest.isSiteBase() ) + { + appendPart( prefix, "site" ); + appendPart( prefix, prefixAndBaseUrlProjectName.toString() ); + appendPart( prefix, prefixAndBaseUrlBranch.getValue() ); + if ( site != null ) + { + appendPart( prefix, site.getPath().toString() ); + } + } + appendPart( prefix, "_" ); + + return prefix.toString(); + }; + + final RewritePathStrategy rewritePathStrategy = requestRewriteStrategy( portalRequest ); + + final ImageUrlGeneratorParams generatorParams = new ImageUrlGeneratorParams(); generatorParams.baseUrlStrategy = baseUrlStrategy; generatorParams.pathPrefixStrategy = pathPrefixStrategy; generatorParams.rewritePathStrategy = rewritePathStrategy; - generatorParams.mediaProvider = - () -> context.callWith( () -> getMedia( Objects.requireNonNullElse( params.getId(), params.getPath() ) ) ); - generatorParams.nearestSiteProvider = () -> context.callWith( () -> { - final ContentResolver contentResolver = new ContentResolver( contentService ); - return contentResolver.resolve( portalRequest ).getNearestSite(); - } ); + + generatorParams.mediaProvider = () -> media; + + generatorParams.projectName = mediaPathProjectName; + generatorParams.branch = mediaPathBranch; generatorParams.scale = params.getScale(); generatorParams.format = params.getFormat(); generatorParams.filter = params.getFilter(); generatorParams.quality = params.getQuality(); generatorParams.background = params.getBackground(); - generatorParams.id = params.getId(); - generatorParams.path = params.getPath(); return generatorParams; } @@ -210,7 +285,7 @@ private Media getMedia( final String contentKey ) if ( !( content instanceof Media ) ) { - throw new NotFoundException( "Content [" + contentKey + "] is not a Media" ) + throw new NotFoundException( String.format( "Content [%s] is not a Media", contentKey ) ) { }; } diff --git a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/AbstractPortalUrlServiceImplTest.java b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/AbstractPortalUrlServiceImplTest.java index 37a918148b5..b984ffe8c58 100644 --- a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/AbstractPortalUrlServiceImplTest.java +++ b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/AbstractPortalUrlServiceImplTest.java @@ -14,7 +14,7 @@ import com.enonic.xp.portal.PortalRequest; import com.enonic.xp.portal.impl.PortalConfig; import com.enonic.xp.portal.impl.RedirectChecksumService; -import com.enonic.xp.portal.impl.url3.MediaService; +import com.enonic.xp.portal.url.UrlStrategyFacade; import com.enonic.xp.repository.RepositoryId; import com.enonic.xp.resource.ResourceService; import com.enonic.xp.style.StyleDescriptorService; @@ -72,7 +72,7 @@ public void setup() this.service = new PortalUrlServiceImpl( this.contentService, this.resourceService, new MacroServiceImpl(), this.styleDescriptorService, - this.redirectChecksumService, mock( MediaService.class ) ); + this.redirectChecksumService, mock( UrlStrategyFacade.class ) ); final PortalConfig portalConfig = mock( PortalConfig.class, invocation -> invocation.getMethod().getDefaultValue() ); when( portalConfig.legacy_imageService_enabled() ).thenReturn( true );