package nl.gertontenham.magnolia.templating.tools.beans;
import info.magnolia.cms.beans.config.RegexpVirtualURIMapping;
import info.magnolia.cms.beans.config.URI2RepositoryMapping;
import info.magnolia.repository.RepositoryConstants;
import nl.gertontenham.magnolia.templating.managers.SiteManager;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Site proxy based virtual uri mapper. Maps a uri to the Configured url/page
*
*/
public class SiteProxyBasedVirtualURIMapping extends RegexpVirtualURIMapping {
private static Logger log = LoggerFactory.getLogger(SiteProxyBasedVirtualURIMapping.class);
public final static String PAGES_PROXY = "/pages-proxy";
private SiteManager sitemanager;
private String fromURI;
private Pattern regexp;
@Inject
public SiteProxyBasedVirtualURIMapping(SiteManager sitemanager) {
super();
this.sitemanager = sitemanager;
}
@Override
public MappingResult mapURI(final String uri, String queryString) {
if (regexp != null) {
final Matcher matcher;
if(queryString != null){
matcher = regexp.matcher(uri + "?" + queryString);
}else{
matcher = regexp.matcher(uri);
}
if (matcher.find()) {
final MappingResult r = new MappingResult();
final int matcherCount = matcher.groupCount();
try {
final String replaced = matcher.replaceAll(getToURI());
r.setLevel(matcherCount + 1);
r.setToURI(replaced);
return r;
} catch (IndexOutOfBoundsException e) {
log.warn("{} misconfigured: {}", toString(), e.getMessage());
}
}
}
return null;
}
@Override
public void setFromURI(String fromURI) {
this.fromURI = StringUtils.defaultIfEmpty(fromURI, "/pages-proxy/(.*)");
this.regexp = Pattern.compile(fromURI);
}
@Override
public String toString() {
return "SiteProxyBasedVirtualURIMapping[" + fromURI + " --> " + getToURI() + "]";
}
@Override
public String getToURI() {
Iterator<URI2RepositoryMapping> hostIt = sitemanager.getCurrentSiteUriMappings().iterator();
while (hostIt.hasNext()) {
URI2RepositoryMapping hk = hostIt.next();
if (StringUtils.equalsIgnoreCase(hk.getRepository(), RepositoryConstants.WEBSITE)) {
return hk.getHandlePrefix() + "/$1";
}
}
return StringUtils.EMPTY;
}
}