/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.web.urlrewrite; import java.io.File; import java.io.FileInputStream; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.tuckey.web.filters.urlrewrite.Conf; import org.tuckey.web.filters.urlrewrite.RewrittenUrl; import org.tuckey.web.filters.urlrewrite.Status; import org.tuckey.web.filters.urlrewrite.UrlRewriter; @Component public class UrlRewriterBeanImpl implements UrlRewriterBean, InitializingBean { private final static Logger LOG = LoggerFactory.getLogger( UrlRewriterBean.class ); private boolean enabled = false; private UrlRewriter urlRewriter; private Pattern[] pathPatternsToSkip; private Conf conf; private boolean logging; private String xmlConfigurationFileLocation; public void afterPropertiesSet() throws Exception { File configFile = new File( getXmlConfigurationFileLocation() ); if ( configFile.exists() ) { enabled = true; FileInputStream fileStream = new FileInputStream( configFile ); conf = new Conf( fileStream, getXmlConfigurationFileLocation() ); urlRewriter = new UrlRewriter( conf ); } ArrayList<String> patternsToSkip = new ArrayList<String>( ); patternsToSkip.add( "^(.*)/site/([0-9]+)(.*)/page(.*)" ); patternsToSkip.add( "^(.*)/site/([0-9]+)(.*)/errorpage(.*)" ); patternsToSkip.add( "^(.*)/site/([0-9]+)(.*)/binary(.*)" ); patternsToSkip.add( "^(.*)/site/([0-9]+)(.*)/datasource(.*)" ); patternsToSkip.add( "^(.*)/site/([0-9]+)(.*)/_default/(.*)" ); setPathPatternsToSkip( patternsToSkip ); } private void setPathPatternsToSkip( List list ) { pathPatternsToSkip = new Pattern[list.size()]; for ( int i = 0; i < list.size(); i++ ) { String patternStr = (String) list.get( i ); pathPatternsToSkip[i] = Pattern.compile( patternStr ); } } public boolean isEnabled() { return enabled; } public String getStatus() { if ( !enabled ) { return "URL rewriting is disabled"; } Status s = new Status( conf ); s.displayStatusOffline(); return s.getBuffer().toString(); } public boolean doRewriteURL( HttpServletRequest hsRequest, HttpServletResponse hsResponse, FilterChain chain ) throws java.io.IOException, javax.servlet.ServletException { if ( !enabled ) { return false; } if ( doSkip( hsRequest ) ) { log( "Skipped: " + hsRequest.getRequestURI() ); return false; } try { RewrittenUrl url = urlRewriter.processRequest( hsRequest, hsResponse ); if ( url == null ) { log( "Ignored: " + hsRequest.getRequestURI() ); return false; } log( "Changed from: " + hsRequest.getRequestURI() + " to: " + url.getTarget() ); return urlRewriter.processRequest( hsRequest, hsResponse, chain ); } catch ( InvocationTargetException e ) { LOG.error( e.getMessage(), e ); } return false; } private void log( String msg ) { if ( logging ) { System.out.println( "UrlRewrite: " + msg ); } } private boolean doSkip( ServletRequest request ) { final HttpServletRequest httpRequest = (HttpServletRequest) request; String lookIn = httpRequest.getRequestURI(); for ( Pattern pattern : pathPatternsToSkip ) { Matcher matcher = pattern.matcher( lookIn ); if ( matcher.find() ) { return true; } } return false; } @Value( "${cms.urlrewrite.logging}" ) public void setLogging( boolean logging ) { this.logging = logging; } public String getXmlConfigurationFileLocation() { return xmlConfigurationFileLocation; } @Value("${cms.home}/config/urlrewrite.xml") public void setXmlConfigurationFileLocation( String xmlConfigurationFileLocation ) { this.xmlConfigurationFileLocation = xmlConfigurationFileLocation; } }