/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.server; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.core.vhost.VirtualHost; import com.enonic.cms.core.vhost.VirtualHostResolver; import com.enonic.cms.core.vhost.VirtualHostHelper; import com.enonic.cms.core.Attribute; /** * Aug 24, 2010 */ public class DeploymentAndRequestSetup { private VirtualHostResolver virtualHostResolver = new VirtualHostResolver(); private String appDeploymentPath; private String scheme = "http"; private String originalRequestedHost; private String originalRequestedURI; private int requestedSiteKey; private String requestedSiteLocalPath; private PortalRequestSetup portalRequestSetup; private AdminDebugRequestSetup adminDebugRequestSetup; private AdminPreviewRequestSetup adminPreviewRequestSetup; public DeploymentAndRequestSetup appDeployedAtRoot() { return appDeployedAt( "/" ); } public DeploymentAndRequestSetup appDeployedAt( String path ) { this.appDeploymentPath = path; return this; } public String getAppDeploymentPath() { return appDeploymentPath; } public String getOriginalRequestedHost() { return originalRequestedHost; } public String getOriginalRequestedURI() { return originalRequestedURI; } public int getRequestedSiteKey() { return requestedSiteKey; } public String getRequestedSiteLocalPath() { return requestedSiteLocalPath; } public DeploymentAndRequestSetup requestedScheme( String scheme ) { this.scheme = scheme; return this; } public DeploymentAndRequestSetup addVirtualHost( String pattern, String targetPath ) { if ( !isAppDeployedAtRoot() ) { throw new IllegalArgumentException( "Virtual Host setup is only supported when deployed at root" ); } virtualHostResolver.addVirtualHost( pattern, targetPath ); return this; } public DeploymentAndRequestSetup originalRequest( String requestedHost, String requestedURI ) { if ( !requestedURI.startsWith( "/" ) ) { throw new IllegalArgumentException( "original requestURI must start with /" ); } originalRequestedHost = requestedHost; originalRequestedURI = requestedURI; return this; } public DeploymentAndRequestSetup requestedSite( int siteKey, String siteLocalPath ) { if ( siteLocalPath.startsWith( "/" ) ) { throw new IllegalArgumentException( "siteLocalPath cannot start with /" ); } this.requestedSiteKey = siteKey; this.requestedSiteLocalPath = siteLocalPath; return this; } public PortalRequestSetup requestedPortalAt() { this.portalRequestSetup = new PortalRequestSetup(); return this.portalRequestSetup; } public AdminDebugRequestSetup requestedAdminDebugAt() { this.adminDebugRequestSetup = new AdminDebugRequestSetup(); return this.adminDebugRequestSetup; } public AdminPreviewRequestSetup requestedAdminPreviewAt() { this.adminPreviewRequestSetup = new AdminPreviewRequestSetup(); return this.adminPreviewRequestSetup; } public void setup( MockHttpServletRequest request ) { request.setScheme( scheme ); if ( !appDeploymentPath.equals( "/" ) ) { request.setContextPath( appDeploymentPath ); } request.setServerName( originalRequestedHost ); request.setRequestURI( originalRequestedURI ); setupVhost( request ); if ( portalRequestSetup != null ) { portalRequestSetup.setup( request ); } else if ( adminDebugRequestSetup != null ) { adminDebugRequestSetup.setup( request ); } else if ( adminPreviewRequestSetup != null ) { adminPreviewRequestSetup.setup( request ); } } private void setupVhost( MockHttpServletRequest request ) { VirtualHost virtualHost = virtualHostResolver.resolve( request ); if ( virtualHost != null ) { String fullSourcePath = virtualHost.getFullSourcePath( request ); VirtualHostHelper.setBasePath( request, fullSourcePath ); } } private boolean isAppDeployedAtRoot() { return appDeploymentPath == null || appDeploymentPath.equals( "" ) || appDeploymentPath.equals( "/" ); } private String spacesToPlus( String s ) { return s.replaceAll( " ", "+" ); } public class PortalRequestSetup { private String siteBasePath; public PortalRequestSetup() { } public PortalRequestSetup siteSetupAtRoot() { this.siteBasePath = ""; return this; } public PortalRequestSetup siteSetupAtPath( String path ) { this.siteBasePath = path; return this; } public PortalRequestSetup siteSetupAtDefaultPath() { this.siteBasePath = "/site"; return this; } public void setup( MockHttpServletRequest request ) { request.setServletPath( "/site" ); if ( isAppDeployedAtRoot() ) { request.setRequestURI( "/site/" + getRequestedSiteKey() + "/" + spacesToPlus( getRequestedSiteLocalPath() ) ); } else { request.setRequestURI( appDeploymentPath + "/site/" + getRequestedSiteKey() + "/" + spacesToPlus( getRequestedSiteLocalPath() ) ); } } public DeploymentAndRequestSetup back() { return DeploymentAndRequestSetup.this; } } public class AdminPreviewRequestSetup { private String adminPath; public AdminPreviewRequestSetup() { if ( !getOriginalRequestedURI().contains( "/preview/" ) ) { throw new IllegalStateException( "Expected original requested URI to contain '/preview/'" ); } } public AdminPreviewRequestSetup setupAtDefaultPath() { this.adminPath = "/admin"; return this; } public void setup( MockHttpServletRequest request ) { request.setServletPath( "/site" ); request.setAttribute( Attribute.PREVIEW_ENABLED, "true" ); String basePath = ""; if ( !isAppDeployedAtRoot() ) { basePath = getAppDeploymentPath(); } request.setRequestURI( basePath + "/site/" + getRequestedSiteKey() + "/" + spacesToPlus( getRequestedSiteLocalPath() ) ); } public DeploymentAndRequestSetup back() { return DeploymentAndRequestSetup.this; } private boolean isSetupAtRoot() { return adminPath == null || adminPath.equals( "" ) || adminPath.equals( "/" ); } } public class AdminDebugRequestSetup { private String adminPath; public AdminDebugRequestSetup() { } public AdminDebugRequestSetup setupAtRoot() { this.adminPath = ""; return this; } public AdminDebugRequestSetup setupAtDefaultPath() { this.adminPath = "/admin"; return this; } public void setup( MockHttpServletRequest request ) { request.setServletPath( "/site" ); String basePath = ""; if ( !isAppDeployedAtRoot() ) { basePath = getAppDeploymentPath(); } request.setRequestURI( basePath + "/site/" + getRequestedSiteKey() + "/" + spacesToPlus( getRequestedSiteLocalPath() ) ); } public DeploymentAndRequestSetup back() { return DeploymentAndRequestSetup.this; } } }