/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.structure; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.util.UrlPathHelper; import com.enonic.cms.core.Path; import com.enonic.cms.core.UrlPathHelperManager; public class SitePathResolver { private UrlPathHelperManager urlPathHelperManager; private String sitePathPrefix = ""; private SiteKeyResolver siteKeyResolver = new SiteKeyResolver(); @Autowired public void setUrlPathHelperManager( UrlPathHelperManager value ) { this.urlPathHelperManager = value; } public void setSitePathPrefix( String value ) { this.sitePathPrefix = value; } public SiteKey resolveSiteKey( HttpServletRequest request ) { return siteKeyResolver.resolveSiteKey( request, sitePathPrefix ); } @SuppressWarnings({"unchecked"}) public SitePath resolveSitePath( HttpServletRequest request ) { SiteKey siteKey = resolveSiteKey( request ); String path = getSitePathString( request, siteKey ); int indexToSitePathPrefix = path.indexOf( sitePathPrefix, 0 ); int indexToSlashBeforeSiteKey = path.indexOf( '/', indexToSitePathPrefix + sitePathPrefix.length() ) + 1; int indexToSlashAfterSiteKey = path.indexOf( '/', indexToSlashBeforeSiteKey + 1 ); String localPath; if ( indexToSlashAfterSiteKey == -1 ) { // assume: /sites/123 localPath = ""; } else { localPath = path.substring( indexToSlashAfterSiteKey ); } Map params = request.getParameterMap(); return new SitePath( siteKey, new Path( localPath ), params ); } private String getSitePathString( HttpServletRequest request, SiteKey siteKey ) { UrlPathHelper urlPathHelper = urlPathHelperManager.getUrlPathHelper( siteKey ); String path = urlPathHelper.getRequestUri( request ); if ( !hasSitePathPrefix( path ) ) { path = urlPathHelper.getOriginatingRequestUri( request ); } return path; } private boolean hasSitePathPrefix( String path ) { return path.indexOf( sitePathPrefix ) >= 0; } }