diff --git a/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageUrlHandler.java b/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageUrlHandler.java index ea9b021338a..e7c3d4bfce8 100644 --- a/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageUrlHandler.java +++ b/modules/lib/lib-portal/src/main/java/com/enonic/xp/lib/portal/url/ImageUrlHandler.java @@ -33,6 +33,12 @@ public final class ImageUrlHandler private String scale; + private String projectName; + + private String branch; + + private String contentKey; + private boolean offline; @Override @@ -78,6 +84,21 @@ public void setScale( final String scale ) this.scale = scale; } + public void setProjectName( final String projectName ) + { + this.projectName = projectName; + } + + public void setBranch( final String branch ) + { + this.branch = branch; + } + + public void setContentKey( final String contentKey ) + { + this.contentKey = contentKey; + } + public void setOffline( final Boolean offline ) { this.offline = Objects.requireNonNullElse( offline, false ); @@ -91,7 +112,10 @@ public String createUrl() .quality( this.quality ) .filter( this.filter ) .format( this.format ) - .scale( this.scale ); + .scale( this.scale ) + .projectName( this.projectName ) + .branch( this.branch ) + .contentKey( this.contentKey ); final ImageUrlGeneratorParams generatorParams = this.offline || this.request == null ? this.urlStrategyFacade.offlineImageUrlParams( params ) diff --git a/modules/lib/lib-portal/src/main/resources/lib/xp/portal.ts b/modules/lib/lib-portal/src/main/resources/lib/xp/portal.ts index 4d784502892..be084ce4d21 100644 --- a/modules/lib/lib-portal/src/main/resources/lib/xp/portal.ts +++ b/modules/lib/lib-portal/src/main/resources/lib/xp/portal.ts @@ -91,6 +91,7 @@ export type ImageUrlParams = IdXorPath & { | 'full'; project?: string; branch?: string; + contentKey?: string; offline?: boolean | undefined; }; @@ -119,6 +120,8 @@ interface ImageUrlHandler { setOffline(value: boolean | undefined): void; + setContentKey(value?: string | null): void; + createUrl(): string; } @@ -136,6 +139,10 @@ interface ImageUrlHandler { * @param {string} [params.format] Format of the image. * @param {string} [params.filter] A number of filters are available to alter the image appearance, for example, blur(3), grayscale(), rounded(5), etc. * @param {string} [params.type=server] URL type. Either `server` (server-relative URL) or `absolute`. + * @param {string} [params.projectName] Name of the project. + * @param {string} [params.branch] Name of the branch. + * @param {string} [params.contentKey] Key of the content. + * @param {boolean} [params.offline] Set to true if the URL should be generated without context of the current request. * @param {object} [params.params] Custom parameters to append to the url. * * @returns {string} The generated URL. @@ -147,13 +154,14 @@ export function imageUrl(params: ImageUrlParams): string { bean.setPath(params.path); bean.setUrlType(params.type); // bean.setQueryParams(__.toScriptValue(params.params)); - bean.setProjectName(params.project); - bean.setBranch(params.branch); bean.setBackground(params.background); bean.setQuality(params.quality); bean.setFilter(params.filter); bean.setFormat(params.format); bean.setScale(params.scale); + bean.setProjectName(params.project); + bean.setBranch(params.branch); + bean.setContentKey(params.contentKey); bean.setOffline(params.offline); return bean.createUrl(); 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 64059353872..983bd2f6255 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 @@ -1,6 +1,6 @@ package com.enonic.xp.portal.url; -import java.util.function.Supplier; +import java.util.Objects; import com.enonic.xp.branch.Branch; import com.enonic.xp.content.Media; @@ -8,25 +8,196 @@ public class ImageUrlGeneratorParams { - public BaseUrlStrategy baseUrlStrategy; + private final BaseUrlStrategy baseUrlStrategy; - public PathPrefixStrategy pathPrefixStrategy; + private final PathPrefixStrategy pathPrefixStrategy; - public RewritePathStrategy rewritePathStrategy; + private final RewritePathStrategy rewritePathStrategy; - public Supplier mediaProvider; + private final Media media; - public ProjectName projectName; + private final ProjectName projectName; - public Branch branch; + private final Branch branch; - public String scale; + private final String background; - public String background; + private final Integer quality; - public Integer quality; + private final String filter; - public String filter; + private final String format; - public String format; + private final String scale; + + private ImageUrlGeneratorParams( final Builder builder ) + { + this.baseUrlStrategy = Objects.requireNonNull( builder.baseUrlStrategy ); + this.pathPrefixStrategy = Objects.requireNonNull( builder.pathPrefixStrategy ); + this.rewritePathStrategy = Objects.requireNonNull( builder.rewritePathStrategy ); + this.media = Objects.requireNonNull( builder.media ); + this.projectName = Objects.requireNonNull( builder.projectName ); + this.branch = Objects.requireNonNull( builder.branch ); + this.scale = Objects.requireNonNull( builder.scale ); + this.background = builder.background; + this.quality = builder.quality; + this.filter = builder.filter; + this.format = builder.format; + } + + public BaseUrlStrategy getBaseUrlStrategy() + { + return baseUrlStrategy; + } + + public PathPrefixStrategy getPathPrefixStrategy() + { + return pathPrefixStrategy; + } + + public RewritePathStrategy getRewritePathStrategy() + { + return rewritePathStrategy; + } + + public Media getMedia() + { + return media; + } + + public ProjectName getProjectName() + { + return projectName; + } + + public Branch getBranch() + { + return branch; + } + + public String getBackground() + { + return background; + } + + public Integer getQuality() + { + return quality; + } + + public String getFilter() + { + return filter; + } + + public String getFormat() + { + return format; + } + + public String getScale() + { + return scale; + } + + public static Builder create() + { + return new Builder(); + } + + public static class Builder + { + private BaseUrlStrategy baseUrlStrategy; + + private PathPrefixStrategy pathPrefixStrategy; + + private RewritePathStrategy rewritePathStrategy; + + private Media media; + + private ProjectName projectName; + + private Branch branch; + + private String background; + + private Integer quality; + + private String filter; + + private String format; + + private String scale; + + public Builder setBaseUrlStrategy( final BaseUrlStrategy baseUrlStrategy ) + { + this.baseUrlStrategy = baseUrlStrategy; + return this; + } + + public Builder setPathPrefixStrategy( final PathPrefixStrategy pathPrefixStrategy ) + { + this.pathPrefixStrategy = pathPrefixStrategy; + return this; + } + + public Builder setRewritePathStrategy( final RewritePathStrategy rewritePathStrategy ) + { + this.rewritePathStrategy = rewritePathStrategy; + return this; + } + + public Builder setMedia( final Media media ) + { + this.media = media; + return this; + } + + public Builder setProjectName( final ProjectName projectName ) + { + this.projectName = projectName; + return this; + } + + public Builder setBranch( final Branch branch ) + { + this.branch = branch; + return this; + } + + public Builder setBackground( final String background ) + { + this.background = background; + return this; + } + + public Builder setQuality( final Integer quality ) + { + this.quality = quality; + return this; + } + + public Builder setFilter( final String filter ) + { + this.filter = filter; + return this; + } + + public Builder setFormat( final String format ) + { + this.format = format; + return this; + } + + public Builder setScale( final String scale ) + { + this.scale = scale; + return this; + } + + public ImageUrlGeneratorParams build() + { + return new ImageUrlGeneratorParams( this ); + } + } } diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/AttachmentUrlBuilder.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/AttachmentUrlBuilder.java index 09860a80197..4d99ace58f1 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/AttachmentUrlBuilder.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/AttachmentUrlBuilder.java @@ -4,100 +4,30 @@ import com.enonic.xp.attachment.Attachment; import com.enonic.xp.attachment.Attachments; -import com.enonic.xp.branch.Branch; import com.enonic.xp.content.Content; -import com.enonic.xp.content.ContentConstants; -import com.enonic.xp.portal.impl.ContentResolverResult; -import com.enonic.xp.portal.impl.VirtualHostContextHelper; import com.enonic.xp.portal.url.AttachmentUrlParams; -import com.enonic.xp.repository.RepositoryUtils; final class AttachmentUrlBuilder extends PortalUrlBuilder { - private boolean legacyAttachmentServiceEnabled; - @Override protected void buildUrl( final StringBuilder url, final Multimap params ) { - final boolean isSlashAPI = portalRequest.getRawPath().startsWith( "/api/" ); - final String projectName = RepositoryUtils.getContentRepoName( this.portalRequest.getRepositoryId() ); - final Branch branch = this.portalRequest.getBranch(); - - if ( isSlashAPI ) - { - url.setLength( 0 ); - appendPart( url, "attachment" ); - appendPart( url, branch == ContentConstants.BRANCH_DRAFT ? projectName + ":" + branch.getValue() : projectName ); - if ( this.params.isDownload() ) - { - params.put( "download", null ); - } - } - else - { - super.buildUrl( url, params ); + super.buildUrl( url, params ); - if ( legacyAttachmentServiceEnabled ) - { - appendPart( url, this.portalRequest.getContentPath().toString() ); - appendPart( url, "_" ); - appendPart( url, "attachment" ); - appendPart( url, this.params.isDownload() ? "download" : "inline" ); - } - else - { - final ContentResolverResult contentResolverResult = - new com.enonic.xp.portal.impl.ContentResolver( contentService ).resolve( portalRequest ); - - if ( contentResolverResult.getNearestSite() != null ) - { - appendPart( url, contentResolverResult.getNearestSite().getPath().toString() ); - } - else - { - url.setLength( 0 ); - appendPart( url, "site" ); - appendPart( url, projectName ); - appendPart( url, branch.getValue() ); - } - - appendPart( url, "_" ); - appendPart( url, "media" ); - appendPart( url, "attachment" ); - appendPart( url, branch == ContentConstants.BRANCH_DRAFT ? projectName + ":" + branch.getValue() : projectName ); - if ( this.params.isDownload() ) - { - params.put( "download", null ); - } - } - } + appendPart( url, this.portalRequest.getContentPath().toString() ); + appendPart( url, "_" ); + appendPart( url, "attachment" ); + appendPart( url, this.params.isDownload() ? "download" : "inline" ); final Content content = resolveContent(); final Attachment attachment = resolveAttachment( content ); final String hash = resolveHash( content, attachment ); - appendPart( url, content.getId().toString() + ( hash != null ? ":" + hash : "" ) ); + appendPart( url, content.getId().toString() + ":" + hash ); appendPart( url, attachment.getName() ); } - @Override - protected String getBaseUrl() - { - return VirtualHostContextHelper.getMediaServiceBaseUrl(); - } - - @Override - protected String getTargetUriPrefix() - { - return "/api/media"; - } - - public void setLegacyAttachmentServiceEnabled( final boolean legacyAttachmentServiceEnabled ) - { - this.legacyAttachmentServiceEnabled = legacyAttachmentServiceEnabled; - } - private Content resolveContent() { final ContentResolver contentResolver = new ContentResolver().portalRequest( this.portalRequest ) @@ -138,13 +68,6 @@ private Attachment resolveAttachment( final Content content ) private String resolveHash( final Content content, final Attachment attachment ) { - if ( legacyAttachmentServiceEnabled ) - { - return this.contentService.getBinaryKey( content.getId(), attachment.getBinaryReference() ); - } - else - { - return attachment.getSha512() != null ? attachment.getSha512().substring( 0, 32 ) : null; - } + return this.contentService.getBinaryKey( content.getId(), attachment.getBinaryReference() ); } } diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageMediaPathStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageMediaPathStrategy.java similarity index 94% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageMediaPathStrategy.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageMediaPathStrategy.java index 20f8a4398c9..8a0005e6026 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageMediaPathStrategy.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageMediaPathStrategy.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import java.util.Objects; @@ -15,12 +15,12 @@ import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendPart; import static com.google.common.base.Strings.isNullOrEmpty; -public class ImageMediaPathStrategy +final class ImageMediaPathStrategy implements PathStrategy { private final ImageMediaPathStrategyParams params; - public ImageMediaPathStrategy( final ImageMediaPathStrategyParams params ) + ImageMediaPathStrategy( final ImageMediaPathStrategyParams params ) { this.params = Objects.requireNonNull( params ); } diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageMediaPathStrategyParams.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageMediaPathStrategyParams.java similarity index 96% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageMediaPathStrategyParams.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageMediaPathStrategyParams.java index f06969ed1a6..795b16c40b5 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageMediaPathStrategyParams.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageMediaPathStrategyParams.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import java.util.Objects; @@ -6,7 +6,7 @@ import com.enonic.xp.content.Media; import com.enonic.xp.project.ProjectName; -public class ImageMediaPathStrategyParams +final class ImageMediaPathStrategyParams { private final Media media; diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImagePathResolver.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImagePathResolver.java deleted file mode 100644 index ebba9e0f0b9..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImagePathResolver.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.enonic.xp.portal.impl.url; - -import com.google.common.collect.LinkedListMultimap; -import com.google.common.collect.Multimap; -import com.google.common.io.Files; - -import com.enonic.xp.attachment.Attachment; -import com.enonic.xp.content.Content; -import com.enonic.xp.content.Media; -import com.enonic.xp.context.ContextAccessor; -import com.enonic.xp.exception.NotFoundException; -import com.enonic.xp.portal.url.ImageMediaUrlParams; - -import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendParams; -import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendPart; -import static com.google.common.base.Strings.isNullOrEmpty; - -public final class ImagePathResolver -{ - private final Content content; - - public ImagePathResolver( final Content content ) - { - this.content = content; - } - - public String resolve( final ImageMediaUrlParams params ) - { - final StringBuilder url = new StringBuilder(); - - final Media media = resolveMedia( content ); - final String hash = resolveHash( media ); - final String name = resolveName( media, params.getFormat() ); - final String scale = resolveScale( params.getScale() ); - - appendPart( url, media.getId() + ( hash != null ? ":" + hash : "" ) ); - appendPart( url, scale ); - appendPart( url, name ); - - final Multimap queryParams = LinkedListMultimap.create(); - queryParams.putAll( params.getQueryParams() ); - if ( params.getQuality() != null ) - { - queryParams.put( "quality", params.getQuality().toString() ); - } - if ( params.getBackground() != null ) - { - queryParams.put( "background", params.getBackground() ); - } - if ( params.getFilter() != null ) - { - queryParams.put( "filter", params.getFilter() ); - } - appendParams( url, queryParams.entries() ); - - return url.toString(); - } - - private Media resolveMedia( final Content content ) - { - if ( !( content instanceof Media ) ) - { - throw new ContentInNotMediaException( - String.format( "Content [%s:%s:%s] is not a Media", ContextAccessor.current().getRepositoryId(), - ContextAccessor.current().getBranch(), content.getId() ) ); - } - return (Media) content; - } - - private String resolveHash( final Media media ) - { - final Attachment attachment = media.getMediaAttachment(); - return attachment.getSha512() != null ? attachment.getSha512().substring( 0, 32 ) : null; - } - - private String resolveName( final Content media, final String format ) - { - final String name = media.getName().toString(); - - if ( format != null ) - { - final String extension = Files.getFileExtension( name ); - if ( isNullOrEmpty( extension ) || !format.equals( extension ) ) - { - return name + "." + format; - } - } - return name; - } - - private String resolveScale( final String scale ) - { - if ( scale == null ) - { - throw new IllegalArgumentException( "Missing mandatory parameter 'scale' for image URL" ); - } - - return scale.replaceAll( "\\s", "" ).replaceAll( "[(,]", "-" ).replace( ")", "" ); - } - - private static class ContentInNotMediaException - extends NotFoundException - { - ContentInNotMediaException( final String message ) - { - super( message ); - } - } - -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageUrlBuilder.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageUrlBuilder.java index 31bc331df8b..0db9b3a42f8 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageUrlBuilder.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/ImageUrlBuilder.java @@ -6,25 +6,17 @@ import com.google.common.hash.Hashing; import com.google.common.io.Files; -import com.enonic.xp.attachment.Attachment; -import com.enonic.xp.branch.Branch; import com.enonic.xp.content.Content; -import com.enonic.xp.content.ContentConstants; import com.enonic.xp.content.Media; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.exception.NotFoundException; -import com.enonic.xp.portal.impl.ContentResolverResult; -import com.enonic.xp.portal.impl.VirtualHostContextHelper; import com.enonic.xp.portal.url.ImageUrlParams; -import com.enonic.xp.repository.RepositoryUtils; import static com.google.common.base.Strings.isNullOrEmpty; final class ImageUrlBuilder extends GenericEndpointUrlBuilder { - private boolean legacyImageServiceEnabled; - ImageUrlBuilder() { super( "image" ); @@ -33,58 +25,14 @@ final class ImageUrlBuilder @Override protected void buildUrl( final StringBuilder url, final Multimap params ) { - final boolean isSlashAPI = portalRequest.getRawPath().startsWith( "/api/" ); - final String projectName = RepositoryUtils.getContentRepoName( this.portalRequest.getRepositoryId() ); - final Branch branch = this.portalRequest.getBranch(); - - if ( isSlashAPI ) - { - params.putAll( this.params.getParams() ); - - url.setLength( 0 ); - appendPart( url, "image" ); - appendPart( url, branch == ContentConstants.BRANCH_DRAFT ? projectName + ":" + branch.getValue() : projectName ); - } - else - { - if ( legacyImageServiceEnabled ) - { - super.buildUrl( url, params ); - } - else - { - params.putAll( this.params.getParams() ); - - final ContentResolverResult contentResolverResult = - new com.enonic.xp.portal.impl.ContentResolver( contentService ).resolve( portalRequest ); - - if ( contentResolverResult.getNearestSite() != null ) - { - appendPart( url, projectName ); - appendPart( url, branch.getValue() ); - appendPart( url, contentResolverResult.getNearestSite().getPath().toString() ); - } - else - { - url.setLength( 0 ); - appendPart( url, "site" ); - appendPart( url, projectName ); - appendPart( url, branch.getValue() ); - } - - appendPart( url, "_" ); - appendPart( url, "media" ); - appendPart( url, "image" ); - appendPart( url, branch == ContentConstants.BRANCH_DRAFT ? projectName + ":" + branch.getValue() : projectName ); - } - } + super.buildUrl( url, params ); final Media media = resolveMedia(); final String hash = resolveHash( media ); final String name = resolveName( media ); final String scale = resolveScale(); - appendPart( url, media.getId() + ( hash != null ? ":" + hash : "" ) ); + appendPart( url, media.getId() + ":" + hash ); appendPart( url, scale ); appendPart( url, name ); @@ -93,23 +41,6 @@ protected void buildUrl( final StringBuilder url, final Multimap addParamIfNeeded( params, "filter", this.params.getFilter() ); } - @Override - protected String getBaseUrl() - { - return VirtualHostContextHelper.getMediaServiceBaseUrl(); - } - - @Override - protected String getTargetUriPrefix() - { - return "/api/media"; - } - - public void setLegacyImageServiceEnabled( final boolean legacyImageServiceEnabled ) - { - this.legacyImageServiceEnabled = legacyImageServiceEnabled; - } - private void addParamIfNeeded( final Multimap params, final String name, final Object value ) { if ( value != null ) @@ -137,23 +68,15 @@ private Media resolveMedia() private String resolveHash( final Media media ) { - if ( legacyImageServiceEnabled ) - { - String binaryKey = this.contentService.getBinaryKey( media.getId(), media.getMediaAttachment().getBinaryReference() ); - return Hashing.sha1() - .newHasher() - .putString( String.valueOf( binaryKey ), StandardCharsets.UTF_8 ) - .putString( String.valueOf( media.getFocalPoint() ), StandardCharsets.UTF_8 ) - .putString( String.valueOf( media.getCropping() ), StandardCharsets.UTF_8 ) - .putString( String.valueOf( media.getOrientation() ), StandardCharsets.UTF_8 ) - .hash() - .toString(); - } - else - { - final Attachment attachment = media.getMediaAttachment(); - return attachment.getSha512() != null ? attachment.getSha512().substring( 0, 32 ) : null; - } + String binaryKey = this.contentService.getBinaryKey( media.getId(), media.getMediaAttachment().getBinaryReference() ); + return Hashing.sha1() + .newHasher() + .putString( String.valueOf( binaryKey ), StandardCharsets.UTF_8 ) + .putString( String.valueOf( media.getFocalPoint() ), StandardCharsets.UTF_8 ) + .putString( String.valueOf( media.getCropping() ), StandardCharsets.UTF_8 ) + .putString( String.valueOf( media.getOrientation() ), StandardCharsets.UTF_8 ) + .hash() + .toString(); } private String resolveName( final Content media ) diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaPathStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/MediaPathStrategy.java similarity index 94% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaPathStrategy.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/MediaPathStrategy.java index ccdf9ab0d26..a1ecb4d8ac9 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaPathStrategy.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/MediaPathStrategy.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import com.enonic.xp.portal.url.PathPrefixStrategy; import com.enonic.xp.portal.url.PathStrategy; diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PageUrlBuilder.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PageUrlBuilder.java index a0cbf6c1377..4d1ca82d09f 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PageUrlBuilder.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PageUrlBuilder.java @@ -4,7 +4,6 @@ import com.enonic.xp.content.ContentPath; import com.enonic.xp.portal.url.PageUrlParams; -import com.enonic.xp.repository.RepositoryUtils; final class PageUrlBuilder extends PortalUrlBuilder @@ -14,13 +13,13 @@ protected void buildUrl( final StringBuilder url, final Multimap { super.buildUrl( url, params ); - if ( this.portalRequest.getRawPath().startsWith( "/api/" ) ) - { - url.setLength( 0 ); - appendPart( url, RepositoryUtils.getContentRepoName( this.portalRequest.getRepositoryId() ) ); - appendPart( url, this.portalRequest.getBranch().toString() ); - setMustBeRewritten( false ); - } +// if ( this.portalRequest.getRawPath().startsWith( "/api/" ) ) +// { +// url.setLength( 0 ); +// appendPart( url, RepositoryUtils.getContentRepoName( this.portalRequest.getRepositoryId() ) ); +// appendPart( url, this.portalRequest.getBranch().toString() ); +// setMustBeRewritten( false ); +// } final ContentPath resolved = resolvePath(); appendPart( url, resolved.toString() ); diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlBuilder.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlBuilder.java index 2336b2aae96..406c50f2203 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlBuilder.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/PortalUrlBuilder.java @@ -3,7 +3,6 @@ import java.math.BigInteger; import java.util.Collection; import java.util.Map; -import java.util.Objects; import java.util.UUID; import javax.servlet.http.HttpServletRequest; @@ -38,8 +37,6 @@ abstract class PortalUrlBuilder protected ResourceService resourceService; - protected boolean mustBeRewritten = true; - public final void setParams( final T params ) { this.params = params; @@ -73,21 +70,6 @@ public final String build() } } - protected String getBaseUrl() - { - return null; - } - - protected String getTargetUriPrefix() - { - return null; - } - - public final void setMustBeRewritten( final boolean mustBeRewritten ) - { - this.mustBeRewritten = mustBeRewritten; - } - private String doBuild() { final StringBuilder str = new StringBuilder(); @@ -97,29 +79,7 @@ private String doBuild() buildUrl( str, params ); appendParams( str, params.entries() ); - final String rawPath = portalRequest.getRawPath(); - final boolean isSlashAPI = rawPath.startsWith( "/api/" ); - - if ( isSlashAPI && !mustBeRewritten ) - { - return str.toString(); - } - - final String baseUrl = isSlashAPI ? getBaseUrl() : null; - if ( baseUrl != null ) - { - return UrlTypeConstants.SERVER_RELATIVE.equals( this.params.getType() ) ? str.toString() : baseUrl + str; - } - - String targetUri = str.toString(); - - if ( isSlashAPI ) - { - String targetPrefix = getTargetUriPrefix(); - targetUri = Objects.requireNonNullElse( targetPrefix, "" ) + ( targetUri.startsWith( "/" ) ? targetUri : "/" + targetUri ); - } - - final UriRewritingResult rewritingResult = ServletRequestUrlHelper.rewriteUri( portalRequest.getRawRequest(), targetUri ); + final UriRewritingResult rewritingResult = ServletRequestUrlHelper.rewriteUri( portalRequest.getRawRequest(), str.toString() ); if ( rewritingResult.isOutOfScope() ) { 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 16887939a21..7ab2345d6ef 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,15 +13,11 @@ 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.UrlService; import com.enonic.xp.portal.url.AbstractUrlParams; import com.enonic.xp.portal.url.ApiUrlParams; import com.enonic.xp.portal.url.AssetUrlParams; -import com.enonic.xp.portal.url.AttachmentMediaUrlParams; import com.enonic.xp.portal.url.AttachmentUrlParams; import com.enonic.xp.portal.url.ComponentUrlParams; import com.enonic.xp.portal.url.GenerateUrlParams; @@ -117,15 +113,11 @@ public String imageUrl( final ImageUrlParams params ) { if ( this.legacyImageServiceEnabled ) { - final ImageUrlBuilder builder = new ImageUrlBuilder(); - builder.setLegacyImageServiceEnabled( this.legacyImageServiceEnabled ); - return build( builder, params ); + return build( new ImageUrlBuilder(), params ); } else { - final PortalRequest portalRequest = PortalRequestAccessor.get(); - - final ImageUrlGeneratorParams generatorParams = portalRequest == null + final ImageUrlGeneratorParams generatorParams = params.getPortalRequest() == null ? urlStrategyFacade.offlineImageUrlParams( params ) : urlStrategyFacade.requestImageUrlParams( params ); @@ -138,9 +130,7 @@ public String attachmentUrl( final AttachmentUrlParams params ) { if ( this.legacyAttachmentServiceEnabled ) { - final AttachmentUrlBuilder builder = new AttachmentUrlBuilder(); - builder.setLegacyAttachmentServiceEnabled( this.legacyAttachmentServiceEnabled ); - return build( builder, params ); + return build( new AttachmentUrlBuilder(), params ); } else { diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RequestBaseUrlStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RequestBaseUrlStrategy.java similarity index 97% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RequestBaseUrlStrategy.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RequestBaseUrlStrategy.java index 3b3a0e5f76e..7588d4c7e0e 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RequestBaseUrlStrategy.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RequestBaseUrlStrategy.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import java.util.Objects; diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RequestRewritePathStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RequestRewritePathStrategy.java similarity index 95% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RequestRewritePathStrategy.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RequestRewritePathStrategy.java index 949f71d3568..2ee7b8fe7b2 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RequestRewritePathStrategy.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RequestRewritePathStrategy.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import com.enonic.xp.portal.PortalRequest; import com.enonic.xp.portal.impl.exception.OutOfScopeException; diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RichTextProcessor.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RichTextProcessor.java index 06ff83b4839..e79bc27343a 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RichTextProcessor.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/RichTextProcessor.java @@ -25,7 +25,6 @@ import com.enonic.xp.portal.url.AttachmentUrlParams; import com.enonic.xp.portal.url.HtmlElementPostProcessor; import com.enonic.xp.portal.url.HtmlProcessorParams; -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; @@ -220,7 +219,6 @@ private void defaultImageProcessing( HtmlElement element, ProcessHtmlParams para .filter( getFilter( imageStyle ) ) .portalRequest( params.getPortalRequest() ); - ImageUrlGeneratorParams p = new ImageUrlGeneratorParams(); final String imageUrl = portalUrlService.imageUrl( imageUrlParams ); element.setAttribute( getLinkAttribute( element ), imageUrl ); diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/SlashApiPathPrefixStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/SlashApiPathPrefixStrategy.java similarity index 84% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/SlashApiPathPrefixStrategy.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/SlashApiPathPrefixStrategy.java index 3ea9eee0a6a..4d3c2a8ddd1 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/SlashApiPathPrefixStrategy.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/SlashApiPathPrefixStrategy.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import com.enonic.xp.portal.url.PathPrefixStrategy; diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlGenerator.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/UrlGenerator.java similarity index 86% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlGenerator.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/UrlGenerator.java index 6d94954469e..4573d258998 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlGenerator.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/UrlGenerator.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import com.enonic.xp.portal.url.BaseUrlStrategy; import com.enonic.xp.portal.url.PathStrategy; @@ -15,11 +15,9 @@ public static String generateUrl( final BaseUrlStrategy baseUrlStrategy, final P final String path = rewritePathStrategy.rewritePath( pathStrategy.generatePath() ); final StringBuilder url = new StringBuilder(); - - appendPart( url, baseUrl ); appendPart( url, path ); - return url.toString(); + return baseUrl + url; } } 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/url/UrlService.java similarity index 50% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlService.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/UrlService.java index 91ec1ff8895..9bcdff77dcf 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/url/UrlService.java @@ -1,22 +1,23 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import com.enonic.xp.portal.url.BaseUrlStrategy; +import com.enonic.xp.portal.url.ImageUrlGeneratorParams; import com.enonic.xp.portal.url.PathPrefixStrategy; import com.enonic.xp.portal.url.RewritePathStrategy; public class UrlService { - public String imageUrl( com.enonic.xp.portal.url.ImageUrlGeneratorParams params ) + public String imageUrl( ImageUrlGeneratorParams params ) { - final BaseUrlStrategy baseUrlStrategy = params.baseUrlStrategy; - final PathPrefixStrategy pathPrefixStrategy = params.pathPrefixStrategy; - final RewritePathStrategy rewritePathStrategy = params.rewritePathStrategy; + final BaseUrlStrategy baseUrlStrategy = params.getBaseUrlStrategy(); + final PathPrefixStrategy pathPrefixStrategy = params.getPathPrefixStrategy(); + final RewritePathStrategy rewritePathStrategy = params.getRewritePathStrategy(); final ImageMediaPathStrategyParams imageMediaPathStrategyParams = ImageMediaPathStrategyParams.create() - .setMedia( params.mediaProvider.get() ) - .setProjectName( params.projectName ) - .setBranch( params.branch ) - .setScale( params.scale ) + .setMedia( params.getMedia() ) + .setProjectName( params.getProjectName() ) + .setBranch( params.getBranch() ) + .setScale( params.getScale() ) .build(); final MediaPathStrategy mediaPathStrategy = 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/url/UrlStrategyFacadeImpl.java similarity index 74% rename from modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlStrategyFacadeImpl.java rename to modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url/UrlStrategyFacadeImpl.java index 73e6eeb14dd..d477981ff2c 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/url/UrlStrategyFacadeImpl.java @@ -1,4 +1,4 @@ -package com.enonic.xp.portal.impl.url3; +package com.enonic.xp.portal.impl.url; import java.util.Objects; @@ -51,47 +51,41 @@ public UrlStrategyFacadeImpl( @Reference final ContentService contentService, @R this.projectService = projectService; } - private String resolveBaseUrl( final SiteConfigs siteConfigs ) + @Override + public BaseUrlStrategy offlineBaseUrlStrategy( final ProjectName projectName, final Branch branch, final Content content ) { - SiteConfig siteConfig = siteConfigs.get( ApplicationKey.from( "com.enonic.xp.site" ) ); - if ( siteConfig != null ) + if ( content == null ) { - return siteConfig.getConfig().getString( "baseUrl" ); - } - return null; - } - - @Override - public BaseUrlStrategy offlineBaseUrlStrategy(final ProjectName projectName, final Branch branch, final Content content) { - if (content == null) { return () -> "/"; } - if (content instanceof Site site) { - String baseUrl = resolveBaseUrl(site.getSiteConfigs()); - if (baseUrl != null) { - return () -> baseUrl; - } + Site site; + if ( !( content instanceof Site ) ) + { + site = ContextBuilder.copyOf( ContextAccessor.current() ) + .repositoryId( projectName.getRepoId() ) + .branch( branch ) + .build() + .callWith( () -> contentService.getNearestSite( ContentId.from( content.getId() ) ) ); + } + else + { + site = (Site) content; } - 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; - } + String baseUrl = resolveBaseUrl( site.getSiteConfigs() ); + if ( baseUrl != null ) + { + return () -> baseUrl; } - Project project = projectService.get( projectName); - if (project != null) { - String baseUrl = resolveBaseUrl(project.getSiteConfigs()); - if (baseUrl != null) { - return () -> baseUrl; + Project project = projectService.get( projectName ); + if ( project != null ) + { + String projectBaseUrl = resolveBaseUrl( project.getSiteConfigs() ); + if ( projectBaseUrl != null ) + { + return () -> projectBaseUrl; } } @@ -143,17 +137,18 @@ public ImageUrlGeneratorParams offlineImageUrlParams( final ImageUrlParams param .build() .callWith( () -> getMedia( Objects.requireNonNullElse( params.getId(), params.getPath() ) ) ); - final Site site = ContextBuilder.copyOf( ContextAccessor.current() ) + final Site site = contentKey != null ? ContextBuilder.copyOf( ContextAccessor.current() ) .repositoryId( prefixAndBaseUrlProjectName.getRepoId() ) .branch( prefixAndBaseUrlBranch ) .build() .callWith( () -> contentKey.startsWith( "/" ) ? contentService.findNearestSiteByPath( ContentPath.from( contentKey ) ) - : contentService.getNearestSite( ContentId.from( contentKey ) ) ); + : contentService.getNearestSite( ContentId.from( contentKey ) ) ) : null; - final BaseUrlStrategy baseUrlStrategy = offlineBaseUrlStrategy( prefixAndBaseUrlProjectName, prefixAndBaseUrlBranch, site ); + final BaseUrlStrategy baseUrlStrategy = + offlineBaseUrlStrategy( prefixAndBaseUrlProjectName, prefixAndBaseUrlBranch, site != null ? site : media ); - final PathPrefixStrategy pathPrefixStrategy = contentKey == null ? () -> "/api" : () -> { + final PathPrefixStrategy pathPrefixStrategy = contentKey == null ? new SlashApiPathPrefixStrategy() : () -> { final StringBuilder prefix = new StringBuilder(); appendPart( prefix, "site" ); @@ -169,23 +164,19 @@ public ImageUrlGeneratorParams offlineImageUrlParams( final ImageUrlParams param final RewritePathStrategy rewritePathStrategy = doNotRewriteStrategy(); - final ImageUrlGeneratorParams generatorParams = new ImageUrlGeneratorParams(); - - generatorParams.baseUrlStrategy = baseUrlStrategy; - generatorParams.pathPrefixStrategy = pathPrefixStrategy; - generatorParams.rewritePathStrategy = rewritePathStrategy; - - 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(); - - return generatorParams; + return ImageUrlGeneratorParams.create() + .setBaseUrlStrategy( baseUrlStrategy ) + .setPathPrefixStrategy( pathPrefixStrategy ) + .setRewritePathStrategy( rewritePathStrategy ) + .setMedia( media ) + .setProjectName( mediaPathProjectName ) + .setBranch( mediaPathBranch ) + .setScale( params.getScale() ) + .setFormat( params.getFormat() ) + .setFilter( params.getFilter() ) + .setQuality( params.getQuality() ) + .setBackground( params.getBackground() ) + .build(); } @Override @@ -232,7 +223,6 @@ public ImageUrlGeneratorParams requestImageUrlParams( final ImageUrlParams param appendPart( prefix, portalRequest.getBaseUri() ); if ( portalRequest.isSiteBase() ) { - appendPart( prefix, "site" ); appendPart( prefix, prefixAndBaseUrlProjectName.toString() ); appendPart( prefix, prefixAndBaseUrlBranch.getValue() ); if ( site != null ) @@ -247,24 +237,29 @@ public ImageUrlGeneratorParams requestImageUrlParams( final ImageUrlParams param final RewritePathStrategy rewritePathStrategy = requestRewriteStrategy( portalRequest ); - final ImageUrlGeneratorParams generatorParams = new ImageUrlGeneratorParams(); - - generatorParams.baseUrlStrategy = baseUrlStrategy; - generatorParams.pathPrefixStrategy = pathPrefixStrategy; - generatorParams.rewritePathStrategy = rewritePathStrategy; - - 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(); + return ImageUrlGeneratorParams.create() + .setBaseUrlStrategy( baseUrlStrategy ) + .setPathPrefixStrategy( pathPrefixStrategy ) + .setRewritePathStrategy( rewritePathStrategy ) + .setMedia( media ) + .setProjectName( mediaPathProjectName ) + .setBranch( mediaPathBranch ) + .setScale( params.getScale() ) + .setFormat( params.getFormat() ) + .setFilter( params.getFilter() ) + .setQuality( params.getQuality() ) + .setBackground( params.getBackground() ) + .build(); + } - return generatorParams; + private String resolveBaseUrl( final SiteConfigs siteConfigs ) + { + SiteConfig siteConfig = siteConfigs.get( ApplicationKey.from( "com.enonic.xp.site" ) ); + if ( siteConfig != null ) + { + return siteConfig.getConfig().getString( "baseUrl" ); + } + return null; } private Content getContent( final String contentKey ) diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/AttachmentMediaPathStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/AttachmentMediaPathStrategy.java deleted file mode 100644 index e5937e773a9..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/AttachmentMediaPathStrategy.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import com.enonic.xp.portal.url.PathStrategy; - -public class AttachmentMediaPathStrategy - implements PathStrategy -{ - private final String contentId; - - public AttachmentMediaPathStrategy( String contentId ) - { - this.contentId = contentId; - } - - @Override - public String generatePath() - { - return "/media/attachment/" + this.contentId; - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/BaseUrlStrategyFactory.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/BaseUrlStrategyFactory.java deleted file mode 100644 index 3c61cbf7ce2..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/BaseUrlStrategyFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; - -import com.enonic.xp.branch.Branch; -import com.enonic.xp.content.ContentService; -import com.enonic.xp.portal.PortalRequest; -import com.enonic.xp.portal.url.BaseUrlStrategy; -import com.enonic.xp.portal.url.ImageMediaUrlParams; -import com.enonic.xp.project.ProjectName; -import com.enonic.xp.web.WebRequest; - -@Component(immediate = true, service = BaseUrlStrategyFactory.class) -public class BaseUrlStrategyFactory -{ - private final ContentService contentService; - - @Activate - public BaseUrlStrategyFactory( @Reference final ContentService contentService ) - { - this.contentService = contentService; - } - - public BaseUrlStrategy create( final ImageMediaUrlParams params ) - { - final WebRequest webRequest = params.getWebRequest(); - - if ( webRequest == null || webRequest.getRawPath().startsWith( "/api/" ) ) - { - final ProjectName projectName = ProjectName.from( params.getProjectName() ); - final Branch branch = Branch.from( params.getBranch() ); - final String siteKey = params.getSiteKey(); - - return new OfflineBaseUrlStrategy( contentService, projectName, branch, siteKey ); - } - else if ( webRequest instanceof PortalRequest portalRequest ) - { - return new RequestBaseUrlStrategy( portalRequest, params.getUrlType() ); - } - else - { - throw new IllegalArgumentException( "Missing project, branch or siteKey" ); - } - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/HarmonizedApiPathPrefixStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/HarmonizedApiPathPrefixStrategy.java deleted file mode 100644 index e1462bbb714..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/HarmonizedApiPathPrefixStrategy.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import com.enonic.xp.portal.PortalRequest; -import com.enonic.xp.portal.url.PathPrefixStrategy; -import com.enonic.xp.project.ProjectName; -import com.enonic.xp.site.Site; - -import static com.enonic.xp.portal.impl.url.UrlBuilderHelper.appendPart; - -public class HarmonizedApiPathPrefixStrategy - implements PathPrefixStrategy -{ - private final HarmonizedApiPathPrefixStrategyParams params; - - public HarmonizedApiPathPrefixStrategy( final HarmonizedApiPathPrefixStrategyParams params ) - { - this.params = params; - } - - @Override - public String generatePathPrefix() - { - final StringBuilder path = new StringBuilder(); - - final PortalRequest portalRequest = this.params.getPortalRequest(); - - if ( portalRequest != null ) - { - appendPart( path, portalRequest.getBaseUri() ); - appendPart( path, ProjectName.from( portalRequest.getRepositoryId() ).toString() ); - appendPart( path, portalRequest.getBranch().getValue() ); - } - else - { - appendPart( path, "site" ); - appendPart( path, params.getProjectName().toString() ); - appendPart( path, params.getBranch().getValue() ); - - } - -// final Site site = params.getNearestSiteStrategy().getNearestSite(); -// -// if ( site != null ) -// { -// appendPart( path, site.getPath().toString() ); -// } - appendPart( path, "_" ); - - return path.toString(); - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/HarmonizedApiPathPrefixStrategyParams.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/HarmonizedApiPathPrefixStrategyParams.java deleted file mode 100644 index bd76e25025e..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/HarmonizedApiPathPrefixStrategyParams.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import java.util.Objects; - -import com.enonic.xp.branch.Branch; -import com.enonic.xp.portal.PortalRequest; -import com.enonic.xp.project.ProjectName; - -public class HarmonizedApiPathPrefixStrategyParams -{ - private final PortalRequest portalRequest; - - private final ProjectName projectName; - - private final Branch branch; - - private final String contentKey; - - private HarmonizedApiPathPrefixStrategyParams( final Builder builder ) - { - this.portalRequest = Objects.requireNonNull( builder.portalRequest ); - this.projectName = builder.projectName; - this.branch = builder.branch; - this.contentKey = builder.contentKey; - } - - public PortalRequest getPortalRequest() - { - return portalRequest; - } - - public ProjectName getProjectName() - { - return projectName; - } - - public Branch getBranch() - { - return branch; - } - - public String getContentKey() - { - return contentKey; - } - - public static Builder create() - { - return new Builder(); - } - - public static class Builder - { - private PortalRequest portalRequest; - - private ProjectName projectName; - - private Branch branch; - - private String contentKey; - - public Builder setPortalRequest( final PortalRequest portalRequest ) - { - this.portalRequest = portalRequest; - return this; - } - - public Builder setProjectName( final ProjectName projectName ) - { - this.projectName = projectName; - return this; - } - - public Builder setBranch( final Branch branch ) - { - this.branch = branch; - return this; - } - - public Builder setContentKey( final String contentKey ) - { - this.contentKey = contentKey; - return this; - } - - public HarmonizedApiPathPrefixStrategyParams build() - { - if ( this.portalRequest == null ) - { - Objects.requireNonNull( this.projectName ); - Objects.requireNonNull( this.branch ); - Objects.requireNonNull( this.contentKey ); - } - else if ( projectName != null || branch != null || contentKey != null ) - { - throw new IllegalArgumentException( "ProjectName, Branch and ContentKey must be null if PortalRequest is not null" ); - } - - return new HarmonizedApiPathPrefixStrategyParams( this ); - } - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageUrlGeneratorParams.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageUrlGeneratorParams.java deleted file mode 100644 index dc08ae6d548..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/ImageUrlGeneratorParams.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import java.util.Objects; - -import com.enonic.xp.branch.Branch; -import com.enonic.xp.content.Media; -import com.enonic.xp.project.ProjectName; - -public class ImageUrlGeneratorParams -{ - private final Media media; - - private final ProjectName projectName; - - private final Branch branch; - - private final String background; - - private final Integer quality; - - private final String filter; - - private final String format; - - private final String scale; - - private ImageUrlGeneratorParams( final Builder builder ) - { - this.media = Objects.requireNonNull( builder.media ); - this.projectName = Objects.requireNonNull( builder.projectName ); - this.branch = Objects.requireNonNull( builder.branch ); - this.scale = Objects.requireNonNull( builder.scale ); - this.background = builder.background; - this.quality = builder.quality; - this.filter = builder.filter; - this.format = builder.format; - } - - public Media getMedia() - { - return media; - } - - public ProjectName getProjectName() - { - return projectName; - } - - public Branch getBranch() - { - return branch; - } - - public String getBackground() - { - return background; - } - - public Integer getQuality() - { - return quality; - } - - public String getFilter() - { - return filter; - } - - public String getFormat() - { - return format; - } - - public String getScale() - { - return scale; - } - - public static class Builder - { - private Media media; - - private ProjectName projectName; - - private Branch branch; - - private String background; - - private Integer quality; - - private String filter; - - private String format; - - private String scale; - - public Builder setMedia( final Media media ) - { - this.media = media; - return this; - } - - public Builder setProjectName( final ProjectName projectName ) - { - this.projectName = projectName; - return this; - } - - public Builder setBranch( final Branch branch ) - { - this.branch = branch; - return this; - } - - public Builder setBackground( final String background ) - { - this.background = background; - return this; - } - - public Builder setQuality( final Integer quality ) - { - this.quality = quality; - return this; - } - - public Builder setFilter( final String filter ) - { - this.filter = filter; - return this; - } - - public Builder setFormat( final String format ) - { - this.format = format; - return this; - } - - public Builder setScale( final String scale ) - { - this.scale = scale; - return this; - } - - public ImageUrlGeneratorParams build() - { - return new ImageUrlGeneratorParams( this ); - } - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaPathPrefixStrategyFactory.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaPathPrefixStrategyFactory.java deleted file mode 100644 index 5380781e0d7..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaPathPrefixStrategyFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; - -import com.enonic.xp.branch.Branch; -import com.enonic.xp.content.ContentService; -import com.enonic.xp.portal.PortalRequest; -import com.enonic.xp.portal.url.ImageMediaUrlParams; -import com.enonic.xp.portal.url.PathPrefixStrategy; -import com.enonic.xp.project.ProjectName; -import com.enonic.xp.web.WebRequest; - -@Component(immediate = true, service = MediaPathPrefixStrategyFactory.class) -public class MediaPathPrefixStrategyFactory -{ - private final ContentService contentService; - - @Activate - public MediaPathPrefixStrategyFactory( @Reference final ContentService contentService ) - { - this.contentService = contentService; - } - - public PathPrefixStrategy create( final ImageMediaUrlParams params ) - { - final WebRequest webRequest = params.getWebRequest(); - - if ( webRequest == null ) - { - return new SlashApiPathPrefixStrategy(); - } - - if ( webRequest instanceof PortalRequest portalRequest ) - { - return new HarmonizedApiPathPrefixStrategy( - HarmonizedApiPathPrefixStrategyParams.create().setPortalRequest( portalRequest ).build() ); - } - - final String projectName = params.getProjectName(); - final String branch = params.getBranch(); - final String siteKey = params.getSiteKey(); - - if ( projectName == null || branch == null || siteKey == null ) - { - throw new IllegalArgumentException( "Missing project, branch or siteKey" ); - } - - return new HarmonizedApiPathPrefixStrategy( HarmonizedApiPathPrefixStrategyParams.create() - .setProjectName( ProjectName.from( projectName ) ) - .setBranch( Branch.from( branch ) ) - .setContentKey( siteKey ) - .build() ); - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaService.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaService.java deleted file mode 100644 index f4cc3abd715..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/MediaService.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import java.util.Objects; - -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Reference; - -import com.enonic.xp.branch.Branch; -import com.enonic.xp.content.Content; -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; -import com.enonic.xp.portal.PortalRequest; -import com.enonic.xp.portal.url.BaseUrlStrategy; -import com.enonic.xp.portal.url.ImageMediaUrlParams; -import com.enonic.xp.portal.url.PathPrefixStrategy; -import com.enonic.xp.portal.url.RewritePathStrategy; -import com.enonic.xp.project.ProjectName; - -@Component(immediate = true, service = MediaService.class) -public class MediaService -{ - private final ContentService contentService; - - private final MediaPathPrefixStrategyFactory mediaPathPrefixStrategyFactory; - - private final BaseUrlStrategyFactory baseUrlStrategyFactory; - - @Activate - public MediaService( @Reference final ContentService contentService, - @Reference final MediaPathPrefixStrategyFactory mediaPathPrefixStrategyFactory, - @Reference final BaseUrlStrategyFactory baseUrlStrategyFactory ) - { - this.contentService = contentService; - this.mediaPathPrefixStrategyFactory = mediaPathPrefixStrategyFactory; - this.baseUrlStrategyFactory = baseUrlStrategyFactory; - } - -// public static PathPrefixStrategy harmonized( PortalRequest portalRequest ) -// { -// return new HarmonizedApiPathPrefixStrategy( contentService, HarmonizedApiPathPrefixStrategyParams.create() -// .setPortalRequest( portalRequest ) -// .build() ); -// } -// -// public static PathPrefixStrategy slashApi( String baseUri ) -// { -// return () -> baseUri; -// } -// -// public static RewritePathStrategy rewriteRequest( PortalRequest portalRequest ) -// { -// return new RequestRewritePathStrategy( portalRequest ); -// } -// -// public static RewritePathStrategy doNotRewrite() -// { -// return path -> path; -// } -// -// public interface GetNearestSiteStrategy -// { -// Site getNearestSite(); -// } -// -// public static GetNearestSiteStrategy predefinedNearestSite( Site site ) -// { -// return () -> site; -// } -// -// public static GetNearestSiteStrategy getNearestSite( PortalRequest portalRequest ) -// { -// return () -> null; // From content resolver -// } -// -// public class UrlGeneratorParams -// { -// private final PathPrefixStrategy pathPrefixStrategy; -// -// private final BaseUrlStrategy baseUrlStrategy; -// -// private final RewritePathStrategy rewritePathStrategy; -// -// private final GetNearestSiteStrategy getNearestSiteStrategy; -// -// private UrlGeneratorParams( final PathPrefixStrategy pathPrefixStrategy, final BaseUrlStrategy baseUrlStrategy, -// final RewritePathStrategy rewritePathStrategy, final GetNearestSiteStrategy getNearestSiteStrategy ) -// { -// this.pathPrefixStrategy = pathPrefixStrategy; -// this.baseUrlStrategy = baseUrlStrategy; -// this.rewritePathStrategy = rewritePathStrategy; -// this.getNearestSiteStrategy = getNearestSiteStrategy; -// } -// } -// -// public String siteRequestImageMediaUrl( PortalRequest r, String p, String b, String f ) -// { -//// String project = Objects.requireNonNullElse( p, r.getRepositoryId() ); -//// PathPrefixStrategy pathPrefixStrategy = harmonized( r ); -//// BaseUrlStrategy baseUrlStrategy = new RequestBaseUrlStrategy( r, UrlTypeConstants.SERVER_RELATIVE ); -// return null; -// } - - public String imageMediaUrl( final ImageMediaUrlParams params ) - { - final PathPrefixStrategy pathPrefixStrategy = mediaPathPrefixStrategyFactory.create( params ); - final BaseUrlStrategy baseUrlStrategy = baseUrlStrategyFactory.create( params ); - final RewritePathStrategy rewritePathStrategy = RewritePathStrategyFactory.mediaRewriteStrategy( params.getWebRequest() ); - - final ProjectName projectName = getProjectName( params ); - final Branch branch = getBranch( params ); - - final Context context = - ContextBuilder.copyOf( ContextAccessor.current() ).repositoryId( projectName.getRepoId() ).branch( branch ).build(); - - final Media media = - context.callWith( () -> getMedia( Objects.requireNonNullElse( params.getContentId(), params.getContentPath() ) ) ); - - //////////// - - final ImageMediaPathStrategyParams imageMediaPathStrategyParams = ImageMediaPathStrategyParams.create() - .setMedia( media ) - .setProjectName( projectName ) - .setBranch( branch ) - .setScale( params.getScale() ) - .build(); - - final MediaPathStrategy mediaPathStrategy = - new MediaPathStrategy( pathPrefixStrategy, new ImageMediaPathStrategy( imageMediaPathStrategyParams ) ); - - return UrlGenerator.generateUrl( baseUrlStrategy, mediaPathStrategy, rewritePathStrategy ); - } - - private ProjectName getProjectName( final ImageMediaUrlParams params ) - { - if ( params.getWebRequest() instanceof PortalRequest portalRequest ) - { - if ( !portalRequest.isSiteBase() ) - { - throw new IllegalArgumentException( "PortalRequest must be site based" ); - } - return ProjectName.from( portalRequest.getRepositoryId() ); - } - else - { - return ProjectName.from( Objects.requireNonNull( params.getProjectName() ) ); - } - } - - private Branch getBranch( final ImageMediaUrlParams params ) - { - if ( params.getWebRequest() instanceof PortalRequest portalRequest ) - { - if ( !portalRequest.isSiteBase() ) - { - throw new IllegalArgumentException( "PortalRequest must be site based" ); - } - return portalRequest.getBranch(); - } - else - { - return Branch.from( Objects.requireNonNullElse( params.getBranch(), "master" ) ); - } - } - - private Media getMedia( final String contentKey ) - { - Content content; - if ( contentKey.startsWith( "/" ) ) - { - content = contentService.getByPath( ContentPath.from( contentKey ) ); - } - else - { - content = contentService.getById( ContentId.from( contentKey ) ); - } - - if ( !( content instanceof Media ) ) - { - throw new ContentInNotMediaException( String.format( "Content [%s] is not a Media", contentKey ) ); - } - - return (Media) content; - } - - private static class ContentInNotMediaException - extends NotFoundException - { - ContentInNotMediaException( final String message ) - { - super( message ); - } - } - -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/OfflineBaseUrlStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/OfflineBaseUrlStrategy.java deleted file mode 100644 index 0ca2ce2cdf2..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/OfflineBaseUrlStrategy.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import com.enonic.xp.branch.Branch; -import com.enonic.xp.content.ContentService; -import com.enonic.xp.portal.url.BaseUrlStrategy; -import com.enonic.xp.project.ProjectName; - -public class OfflineBaseUrlStrategy - implements BaseUrlStrategy -{ - private final ContentService contentService; - - private final ProjectName projectName; - - private final Branch branch; - - private final String siteKey; - - public OfflineBaseUrlStrategy( final ContentService contentService, final ProjectName projectName, final Branch branch, - final String siteKey ) - { - this.contentService = contentService; - this.projectName = projectName; - this.branch = branch; - this.siteKey = siteKey; - } - - @Override - public String generateBaseUrl() - { - return "/"; - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/OfflineRewritePathStrategy.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/OfflineRewritePathStrategy.java deleted file mode 100644 index 036fa26d0f6..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/OfflineRewritePathStrategy.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import com.enonic.xp.portal.url.RewritePathStrategy; - -public class OfflineRewritePathStrategy - implements RewritePathStrategy -{ - @Override - public String rewritePath( final String path ) - { - return path; - } -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RewritePathStrategyFactory.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RewritePathStrategyFactory.java deleted file mode 100644 index 651d1544c11..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/RewritePathStrategyFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import com.enonic.xp.portal.PortalRequest; -import com.enonic.xp.portal.url.RewritePathStrategy; -import com.enonic.xp.web.WebRequest; - -public class RewritePathStrategyFactory -{ - - public static RewritePathStrategy mediaRewriteStrategy( final WebRequest webRequest ) - { - if ( webRequest instanceof PortalRequest portalRequest ) - { - return new RequestRewritePathStrategy( portalRequest ); - } - else - { - return new OfflineRewritePathStrategy(); - } - } - -} diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlGeneratorParams.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlGeneratorParams.java deleted file mode 100644 index db1db2678d6..00000000000 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/url3/UrlGeneratorParams.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.enonic.xp.portal.impl.url3; - -import java.util.Objects; - -import com.enonic.xp.portal.url.BaseUrlStrategy; -import com.enonic.xp.portal.url.PathStrategy; -import com.enonic.xp.portal.url.RewritePathStrategy; - -public class UrlGeneratorParams -{ - protected final BaseUrlStrategy baseUrlStrategy; - - protected final PathStrategy pathStrategy; - - protected final RewritePathStrategy rewritePathStrategy; - - protected UrlGeneratorParams( final BaseUrlStrategy baseUrlStrategy, final PathStrategy pathStrategy, - final RewritePathStrategy rewritePathStrategy ) - { - this.baseUrlStrategy = Objects.requireNonNull( baseUrlStrategy ); - this.pathStrategy = Objects.requireNonNull( pathStrategy ); - this.rewritePathStrategy = Objects.requireNonNull( rewritePathStrategy ); - } - - public BaseUrlStrategy getBaseUrlStrategy() - { - return baseUrlStrategy; - } - - public PathStrategy getPathStrategy() - { - return pathStrategy; - } - - public RewritePathStrategy getRewritePathStrategy() - { - return rewritePathStrategy; - } -} 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 b984ffe8c58..48dc9f6f5d3 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 @@ -15,6 +15,7 @@ import com.enonic.xp.portal.impl.PortalConfig; import com.enonic.xp.portal.impl.RedirectChecksumService; import com.enonic.xp.portal.url.UrlStrategyFacade; +import com.enonic.xp.project.ProjectService; import com.enonic.xp.repository.RepositoryId; import com.enonic.xp.resource.ResourceService; import com.enonic.xp.style.StyleDescriptorService; @@ -70,9 +71,13 @@ public void setup() this.redirectChecksumService = mock( RedirectChecksumService.class ); + ProjectService projectService = mock( ProjectService.class ); + + UrlStrategyFacade urlStrategyFacade = new UrlStrategyFacadeImpl( this.contentService, projectService ); + this.service = new PortalUrlServiceImpl( this.contentService, this.resourceService, new MacroServiceImpl(), this.styleDescriptorService, - this.redirectChecksumService, mock( UrlStrategyFacade.class ) ); + this.redirectChecksumService, urlStrategyFacade ); final PortalConfig portalConfig = mock( PortalConfig.class, invocation -> invocation.getMethod().getDefaultValue() ); when( portalConfig.legacy_imageService_enabled() ).thenReturn( true ); diff --git a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/ImageUrlBuilderTest.java b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/ImageUrlBuilderTest.java index c7d3e210bce..f0cd94bd1e0 100644 --- a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/ImageUrlBuilderTest.java +++ b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/ImageUrlBuilderTest.java @@ -72,7 +72,6 @@ public void init() this.imageUrlParams = new ImageUrlParams().portalRequest( portalRequest ).scale( "testScale" ); urlBuilder = new ImageUrlBuilder(); - urlBuilder.setLegacyImageServiceEnabled( true ); urlBuilder.setParams( imageUrlParams ); urlBuilder.contentService = contentService; @@ -198,8 +197,6 @@ public void testImageUrlForAsMedia() imageUrlParams.scale( "block(310,175)" ); - urlBuilder.setLegacyImageServiceEnabled( false ); - final String url = urlBuilder.build(); assertEquals( "/site/myproject/draft/mysite/_/media/image/myproject:draft/testID:ec25d6e4126c7064f82aaab8b34693fc/block-310-175/testName", @@ -225,8 +222,6 @@ public void testImageUrlForAsMediaWithFallbackToProject() imageUrlParams.scale( "block(310,175)" ); - urlBuilder.setLegacyImageServiceEnabled( false ); - final String url = urlBuilder.build(); assertEquals( "/site/myproject/draft/_/media/image/myproject:draft/testID:ec25d6e4126c7064f82aaab8b34693fc/block-310-175/testName", url ); diff --git a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl_imageUrlTest.java b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl_imageUrlTest.java index e9eea7c8db2..a39931ec582 100644 --- a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl_imageUrlTest.java +++ b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/url/PortalUrlServiceImpl_imageUrlTest.java @@ -3,13 +3,18 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import com.enonic.xp.app.ApplicationKey; import com.enonic.xp.content.Content; import com.enonic.xp.content.ContentConstants; +import com.enonic.xp.content.ContentId; +import com.enonic.xp.content.ContentName; import com.enonic.xp.content.ContentNotFoundException; import com.enonic.xp.content.ContentPath; 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.data.PropertyTree; import com.enonic.xp.portal.impl.ContentFixtures; import com.enonic.xp.portal.impl.PortalConfig; import com.enonic.xp.portal.url.ContextPathType; @@ -20,9 +25,12 @@ import com.enonic.xp.security.acl.AccessControlEntry; import com.enonic.xp.security.acl.AccessControlList; import com.enonic.xp.site.Site; +import com.enonic.xp.site.SiteConfig; +import com.enonic.xp.site.SiteConfigs; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -37,7 +45,8 @@ public void createUrl() final ImageUrlParams params = new ImageUrlParams().portalRequest( this.portalRequest ).scale( "max(300)" ).validate(); final String url = this.service.imageUrl( params ); - assertEquals( "/site/myproject/draft/a/b/mycontent/_/image/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent", url ); + assertEquals( "/site/myproject/draft/a/b/mycontent/_/image/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent", + url ); } @Test @@ -63,7 +72,8 @@ public void createUrl_withFormat() new ImageUrlParams().format( "png" ).portalRequest( this.portalRequest ).scale( "max(300)" ).validate(); final String url = this.service.imageUrl( params ); - assertEquals( "/site/myproject/draft/a/b/mycontent/_/image/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent.png", url ); + assertEquals( "/site/myproject/draft/a/b/mycontent/_/image/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent.png", + url ); } @Test @@ -145,7 +155,8 @@ public void createUrl_absolute() final String url = this.service.imageUrl( params ); assertEquals( - "http://localhost/site/myproject/draft/a/b/mycontent/_/image/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent", url ); + "http://localhost/site/myproject/draft/a/b/mycontent/_/image/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent", + url ); } @Test @@ -179,8 +190,9 @@ public void createImageUrlForSlashApiWithVhostContextConfig() .scale( "max(300)" ); String url = this.service.imageUrl( params ); - assertEquals( "http://media.enonic.com/image/myproject:draft/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent.png", - url ); + assertEquals( + "http://media.enonic.com/image/myproject:draft/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent.png", + url ); params = new ImageUrlParams().format( "png" ) .type( UrlTypeConstants.SERVER_RELATIVE ) @@ -193,43 +205,47 @@ public void createImageUrlForSlashApiWithVhostContextConfig() } @Test - public void createUrlForSlashApi() + public void createImageUrlForMasterBranch() { - this.portalRequest.setBaseUri( "" ); - this.portalRequest.setRawPath( "/api/com.enonic.app.appname" ); - this.portalRequest.setContent( createContent() ); + ContextAccessor.current().getLocalScope().setAttribute( RepositoryId.from( "com.enonic.cms.myproject1" ) ); + ContextAccessor.current().getLocalScope().setAttribute( ContentConstants.BRANCH_DRAFT ); - when( req.getServerName() ).thenReturn( "localhost" ); - when( req.getScheme() ).thenReturn( "http" ); - when( req.getServerPort() ).thenReturn( 80 ); + final ImageUrlParams params = new ImageUrlParams().format( "png" ) + .projectName( "myproject2" ) + .branch( "master" ) + .contentKey( "siteId" ) + .id( "123456" ) + .scale( "max(300)" ); - ImageUrlParams params = - new ImageUrlParams().format( "png" ).type( UrlTypeConstants.ABSOLUTE ).portalRequest( this.portalRequest ).scale( "max(300)" ); + final PortalConfig portalConfig = mock( PortalConfig.class, invocation -> invocation.getMethod().getDefaultValue() ); + when( portalConfig.legacy_imageService_enabled() ).thenReturn( false ); + this.service.activate( portalConfig ); - Context context = ContextBuilder.create().build(); - String url = context.callWith( () -> this.service.imageUrl( params ) ); - assertEquals( "http://localhost/api/media/image/myproject:draft/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent.png", - url ); - } + final PropertyTree config = new PropertyTree(); + config.addString( "baseUrl", "https://cdn.company.com" ); - @Test - public void createImageUrlForMasterBranch() - { - this.portalRequest.setBaseUri( "" ); - this.portalRequest.setRawPath( "/api/com.enonic.app.appname" ); - this.portalRequest.setContent( createContent() ); - this.portalRequest.setBranch( ContentConstants.BRANCH_MASTER ); + SiteConfigs siteConfigs = SiteConfigs.create() + .add( SiteConfig.create().application( ApplicationKey.from( "com.enonic.xp.site" ) ).config( config ).build() ) + .build(); - when( req.getServerName() ).thenReturn( "localhost" ); - when( req.getScheme() ).thenReturn( "http" ); - when( req.getServerPort() ).thenReturn( 80 ); + final Site site = mock( Site.class ); + when( site.getPath() ).thenReturn( ContentPath.from( "/mysite" ) ); + when( site.getSiteConfigs() ).thenReturn( siteConfigs ); + when( site.getPermissions() ).thenReturn( + AccessControlList.of( AccessControlEntry.create().principal( RoleKeys.ADMIN ).allowAll().build() ) ); - ImageUrlParams params = - new ImageUrlParams().format( "png" ).type( UrlTypeConstants.ABSOLUTE ).portalRequest( this.portalRequest ).scale( "max(300)" ); + when( contentService.getNearestSite( eq( ContentId.from( "siteId" ) ) ) ).thenReturn( site ); - Context context = ContextBuilder.create().build(); - String url = context.callWith( () -> this.service.imageUrl( params ) ); - assertEquals( "http://localhost/api/media/image/myproject/123456:8cf45815bba82c9711c673c9bb7304039a790026/max-300/mycontent.png", url ); + final Media media = mock( Media.class ); + when( media.getId() ).thenReturn( ContentId.from( "123456" ) ); + when( media.getName() ).thenReturn( ContentName.from( "mycontent.png" ) ); + when( media.getMediaAttachment() ).thenReturn( ContentFixtures.newMedia().getMediaAttachment() ); + when( contentService.getById( eq( ContentId.from( "123456" ) ) ) ).thenReturn( media ); + + final String url = this.service.imageUrl( params ); + assertEquals( + "https://cdn.company.com/site/myproject1/draft/mysite/_/media/image/myproject2/123456:ec25d6e4126c7064f82aaab8b34693fc/max-300/mycontent.png", + url ); } @Test @@ -260,33 +276,78 @@ public void createImageUrlWhenLegacyModeDisabledWithoutSite() @Test public void createImageUrlWhenLegacyModeDisabledWithSite() { - this.portalRequest.setBaseUri( "/site" ); - this.portalRequest.setRawPath( "/site/myproject/draft/a/b/mycontent" ); - this.portalRequest.setContent( createContent() ); + final ImageUrlParams params = new ImageUrlParams().format( "png" ) + .projectName( "myproject" ) + .branch( "draft" ) + .contentKey( "siteId" ) + .id( "123456" ) + .scale( "max(300)" ); - final ImageUrlParams params = - new ImageUrlParams().format( "png" ).type( UrlTypeConstants.ABSOLUTE ).portalRequest( this.portalRequest ).scale( "max(300)" ); + final PortalConfig portalConfig = mock( PortalConfig.class, invocation -> invocation.getMethod().getDefaultValue() ); + when( portalConfig.legacy_imageService_enabled() ).thenReturn( false ); + this.service.activate( portalConfig ); - when( req.getServerName() ).thenReturn( "localhost" ); - when( req.getScheme() ).thenReturn( "http" ); - when( req.getServerPort() ).thenReturn( 8080 ); + final PropertyTree config = new PropertyTree(); + config.addString( "baseUrl", "https://cdn.company.com" ); + + SiteConfigs siteConfigs = SiteConfigs.create() + .add( SiteConfig.create().application( ApplicationKey.from( "com.enonic.xp.site" ) ).config( config ).build() ) + .build(); + + final Site site = mock( Site.class ); + when( site.getPath() ).thenReturn( ContentPath.from( "/mysite" ) ); + when( site.getSiteConfigs() ).thenReturn( siteConfigs ); + when( site.getPermissions() ).thenReturn( + AccessControlList.of( AccessControlEntry.create().principal( RoleKeys.ADMIN ).allowAll().build() ) ); + + when( contentService.getNearestSite( eq( ContentId.from( "siteId" ) ) ) ).thenReturn( site ); + + final Media media = mock( Media.class ); + when( media.getId() ).thenReturn( ContentId.from( "123456" ) ); + when( media.getName() ).thenReturn( ContentName.from( "mycontent.png" ) ); + when( media.getMediaAttachment() ).thenReturn( ContentFixtures.newMedia().getMediaAttachment() ); + when( contentService.getById( eq( ContentId.from( "123456" ) ) ) ).thenReturn( media ); + + final String url = this.service.imageUrl( params ); + assertEquals( + "https://cdn.company.com/site/myproject/draft/mysite/_/media/image/myproject:draft/123456:ec25d6e4126c7064f82aaab8b34693fc/max-300/mycontent.png", + url ); + } + + @Test + public void createImageUrlWhenLegacyModeDisabledSlashApi() + { + final ImageUrlParams params = + new ImageUrlParams().format( "png" ).projectName( "myproject" ).branch( "draft" ).id( "123456" ).scale( "max(300)" ); final PortalConfig portalConfig = mock( PortalConfig.class, invocation -> invocation.getMethod().getDefaultValue() ); when( portalConfig.legacy_imageService_enabled() ).thenReturn( false ); this.service.activate( portalConfig ); + final PropertyTree config = new PropertyTree(); + config.addString( "baseUrl", "https://cdn.company.com" ); + + SiteConfigs siteConfigs = SiteConfigs.create() + .add( SiteConfig.create().application( ApplicationKey.from( "com.enonic.xp.site" ) ).config( config ).build() ) + .build(); + + final Media media = mock( Media.class ); + when( media.getId() ).thenReturn( ContentId.from( "123456" ) ); + when( media.getName() ).thenReturn( ContentName.from( "mycontent.png" ) ); + when( media.getMediaAttachment() ).thenReturn( ContentFixtures.newMedia().getMediaAttachment() ); + when( contentService.getById( eq( ContentId.from( "123456" ) ) ) ).thenReturn( media ); + final Site site = mock( Site.class ); - when( site.getPath() ).thenReturn( ContentPath.from( "/a/b" ) ); + when( site.getPath() ).thenReturn( ContentPath.from( "/mysite" ) ); + when( site.getSiteConfigs() ).thenReturn( siteConfigs ); when( site.getPermissions() ).thenReturn( AccessControlList.of( AccessControlEntry.create().principal( RoleKeys.ADMIN ).allowAll().build() ) ); - when( contentService.getByPath( ContentPath.from( "/a/b" ) ) ).thenReturn( site ); - when( contentService.findNearestSiteByPath( ContentPath.from( "/a/b/mycontent" ) ) ).thenReturn( site ); + when( contentService.getNearestSite( eq( media.getId() ) ) ).thenReturn( site ); final String url = this.service.imageUrl( params ); assertEquals( - "http://localhost:8080/site/myproject/draft/a/b/_/media/image/myproject:draft/123456:ec25d6e4126c7064f82aaab8b34693fc/max-300/mycontent.png", - url ); + "https://cdn.company.com/api/media/image/myproject:draft/123456:ec25d6e4126c7064f82aaab8b34693fc/max-300/mycontent.png", url ); } @Test