Index: src/main/java/info/magnolia/module/extendedtemplatingkit/filters/MultiSiteFilter.java =================================================================== --- src/main/java/info/magnolia/module/extendedtemplatingkit/filters/MultiSiteFilter.java (revision 34325) +++ src/main/java/info/magnolia/module/extendedtemplatingkit/filters/MultiSiteFilter.java (working copy) @@ -58,24 +58,16 @@ SiteManager siteManager = SiteManager.Factory.getInstance(); - Site site = siteManager.getAssignedSite(domain, aggregationState.getCurrentURI()); + final String uri = aggregationState.getCurrentURI(); + Site site = siteManager.getAssignedSite(domain, uri); // in case we are not surfing from the domain we remove the site prefix now // rest will be handled by the repository to uri mapping + + // FIXME what if all sites don't define a domain -> any domain if(site != null && !site.getDomains().contains(aggregationState.getDomainName())){ aggregationState.setCrossSiteAccess(true); - String cleanURI; - if (StringUtils.equals(aggregationState.getCurrentURI(), "/" + site.getName() + ".html")) { - // homepage - cleanURI = "/"; - } else { - // make sure we do not remove by accident only part of the path in case it starts with the same name as the site name - cleanURI = StringUtils.removeStart(aggregationState.getCurrentURI(), "/" + site.getName() + "/"); - // only when prefix was removed ... - if (!cleanURI.startsWith("/")) { - cleanURI = "/" + cleanURI; - } - } + String cleanURI = cleanURI(site, uri); aggregationState.setCurrentURI(cleanURI); } @@ -88,6 +80,23 @@ } + String cleanURI(Site site, final String uri) { + String cleanURI; + if (StringUtils.equals(uri, "/" + site.getName() + ".html")) { + // homepage + cleanURI = "/"; + } else { + // make sure we do not remove by accident only part of the path in case it starts with the same name as the site name + cleanURI = StringUtils.removeStart(uri, "/" + site.getName() + "/"); + // only when prefix was removed ... + if (!cleanURI.startsWith("/")) { + cleanURI = "/" + cleanURI; + } + } + return cleanURI; + } + + /** * Determines the domain name that matches the domain name configured in site configuration. By default just returns the exact name from the incoming request. * @param request Index: src/main/java/info/magnolia/module/extendedtemplatingkit/sites/ETKSiteManager.java =================================================================== --- src/main/java/info/magnolia/module/extendedtemplatingkit/sites/ETKSiteManager.java (revision 34325) +++ src/main/java/info/magnolia/module/extendedtemplatingkit/sites/ETKSiteManager.java (working copy) @@ -86,17 +86,25 @@ uri = StringUtils.replaceOnce(uri, ".", "/"); } // since site was not recognized, try to resolve it based on the URI + Site bestMatchingSite = null; + int matchingLength = -1; + for (Site site : getSites()) { for (URI2RepositoryMapping mapping : site.getMappings().values()) { - // handle also the case where uri starts with the name same as some site def, but with no site defined at all - final String prefix = StringUtils.stripEnd(mapping.getHandlePrefix(),"/") + "/"; - if (uri.startsWith(mapping.getHandlePrefix()) && StringUtils.indexOf(uri, prefix) != -1 && mapping.matches("/" + StringUtils.stripStart(StringUtils.substringAfter(uri, prefix), "/"))) { + if (uri.startsWith(mapping.getHandlePrefix())) { log.debug("Failed to resolve site based on domain - Site {} selected from attempt to resolve site based on URI {}.", site.getName(), uri); - //aggregationState.setShortenUrls(false); - return site; + if(mapping.getHandlePrefix().length() > matchingLength){ + bestMatchingSite = site; + matchingLength = mapping.getHandlePrefix().length(); + } } } } + + if(bestMatchingSite!=null){ + return bestMatchingSite; + } + // nothing above worked - get the default site log.debug("Failed to resolve site. Using Default instead."); return getDefaultSite(); Index: src/main/java/info/magnolia/module/extendedtemplatingkit/ETKModule.java =================================================================== --- src/main/java/info/magnolia/module/extendedtemplatingkit/ETKModule.java (revision 34325) +++ src/main/java/info/magnolia/module/extendedtemplatingkit/ETKModule.java (working copy) @@ -15,6 +15,7 @@ package info.magnolia.module.extendedtemplatingkit; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import info.magnolia.module.templatingkit.badge.LicenseChecker; @@ -30,7 +31,7 @@ public final static String LICENSING_METHOD = "ee"; - private Map sites = new HashMap(); + private Map sites = new LinkedHashMap(); private static ETKModule instance; Index: src/test/java/info/magnolia/license/LicenseUtil.java =================================================================== --- src/test/java/info/magnolia/license/LicenseUtil.java (revision 0) +++ src/test/java/info/magnolia/license/LicenseUtil.java (revision 0) @@ -0,0 +1,7 @@ +package info.magnolia.license; + +public class LicenseUtil { + public static boolean isLicensed(String moduleName) { + return true; + } +} Index: src/test/java/info/magnolia/module/extendedtemplatingkit/filters/MultiSiteFilterTest.java =================================================================== --- src/test/java/info/magnolia/module/extendedtemplatingkit/filters/MultiSiteFilterTest.java (revision 34325) +++ src/test/java/info/magnolia/module/extendedtemplatingkit/filters/MultiSiteFilterTest.java (working copy) @@ -16,9 +16,12 @@ import java.util.Collections; +import info.magnolia.cms.beans.config.URI2RepositoryMapping; import info.magnolia.context.MgnlContext; import info.magnolia.context.SystemContext; import info.magnolia.context.WebContext; +import info.magnolia.module.extendedtemplatingkit.ETKModule; +import info.magnolia.module.extendedtemplatingkit.sites.ETKSiteManager; import info.magnolia.module.templatingkit.ExtendedAggregationState; import info.magnolia.module.templatingkit.sites.Site; import info.magnolia.module.templatingkit.sites.SiteManager; @@ -145,4 +148,29 @@ verify(mocks); } + + /** + * Test cleaning of the URI after the site detection. Further rewriting will be done by the {@link URI2RepositoryMapping} later in the fitler chain. + */ + public void testURICleaning(){ + Site mySite = createSite("mysite", "/", "/site-root"); + Site subSite = createSite("subsite", "/subsite-root", "/site-root/subsite-root"); + + final MultiSiteFilter filter = new MultiSiteFilter(); + + assertEquals("/about.html", filter.cleanURI(mySite, "/mysite/about.html")); + assertEquals("/about.html", filter.cleanURI(mySite, "/site-root/about.html")); + + assertEquals("/subsite-root/about.html", filter.cleanURI(subSite, "/subsite/about.html")); + assertEquals("/subsite-root/about.html", filter.cleanURI(subSite, "/site-root/subsite-root/about.html")); + + } + + private Site createSite(String name, String from, String to) { + Site mySite = new Site(); + mySite.setName(name); + mySite.addMapping("website", new URI2RepositoryMapping(from, "website", to)); + return mySite; + } + } Index: src/test/java/info/magnolia/module/extendedtemplatingkit/sites/ETKSiteManagerTest.java =================================================================== --- src/test/java/info/magnolia/module/extendedtemplatingkit/sites/ETKSiteManagerTest.java (revision 0) +++ src/test/java/info/magnolia/module/extendedtemplatingkit/sites/ETKSiteManagerTest.java (revision 0) @@ -0,0 +1,68 @@ +package info.magnolia.module.extendedtemplatingkit.sites; + +import info.magnolia.cms.beans.config.URI2RepositoryMapping; +import info.magnolia.module.extendedtemplatingkit.ETKModule; +import info.magnolia.module.templatingkit.sites.Site; +import junit.framework.TestCase; + +public class ETKSiteManagerTest extends TestCase { + + + public void testURIBasedSiteMapping(){ + ETKModule etk = new ETKModule(); + ETKSiteManager siteManager = new ETKSiteManager(); + + Site defaultSite = addDefaultSite(etk); + Site mySite = addSite(etk, "mysite", "/", "/site-root"); + + defaultAsserts(siteManager, defaultSite, mySite); + + } + + private void defaultAsserts(ETKSiteManager siteManager, Site defaultSite, + Site mySite) { + // mysite if we use the sitename and shorten the url + assertEquals(mySite, siteManager.getAssignedSite("any", "/mysite/about.html")); + + // mysite if the root path mapps + assertEquals(mySite, siteManager.getAssignedSite("any", "/site-root/about.html")); + + // default if not mapping + assertEquals(defaultSite, siteManager.getAssignedSite("any", "/any-other-path/about.html")); + } + + public void testURIBasedSubSiteMapping(){ + ETKModule etk = new ETKModule(); + ETKSiteManager siteManager = new ETKSiteManager(); + + Site defaultSite = addDefaultSite(etk); + Site mySite = addSite(etk, "mysite", "/", "/site-root"); + Site subSite = addSite(etk, "subsite", "/subsite-root", "/site-root/subsite-root"); + + // sitename and shorten uri + assertEquals(subSite, siteManager.getAssignedSite("any", "/subsite/subsite-root/about.html")); + + // direct full uri + assertEquals(subSite, siteManager.getAssignedSite("any", "/site-root/subsite-root/about.html")); + + defaultAsserts(siteManager, defaultSite, mySite); + + } + + private Site addSite(ETKModule etk, String name, String from, String to) { + Site mySite = new Site(); + mySite.setName(name); + mySite.addMapping("website", new URI2RepositoryMapping(from, "website", to)); + etk.addSite(name, mySite); + return mySite; + } + + private Site addDefaultSite(ETKModule etk) { + Site defaultSite = new Site(); + defaultSite.setName("default"); + etk.addSite("default", defaultSite); + return defaultSite; + } + + +}