Author: olli
Date: Mon Jun  2 20:45:28 2014
New Revision: 1599355

URL: http://svn.apache.org/r1599355
Log:
SLING-3518 add initial version of Apache Sling URL Rewriter

Added:
    sling/trunk/contrib/extensions/urlrewriter/
    sling/trunk/contrib/extensions/urlrewriter/README.md
    sling/trunk/contrib/extensions/urlrewriter/pom.xml
    sling/trunk/contrib/extensions/urlrewriter/src/
    sling/trunk/contrib/extensions/urlrewriter/src/main/
    sling/trunk/contrib/extensions/urlrewriter/src/main/java/
    sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/
    sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/
    sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/sling/
    
sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/sling/urlrewriter/
    
sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/sling/urlrewriter/SlingUrlRewriteFilter.java
    sling/trunk/contrib/extensions/urlrewriter/src/main/resources/
    sling/trunk/contrib/extensions/urlrewriter/src/main/resources/OSGI-INF/
    
sling/trunk/contrib/extensions/urlrewriter/src/main/resources/OSGI-INF/metatype/
    
sling/trunk/contrib/extensions/urlrewriter/src/main/resources/OSGI-INF/metatype/metatype.properties

Added: sling/trunk/contrib/extensions/urlrewriter/README.md
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/urlrewriter/README.md?rev=1599355&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/urlrewriter/README.md (added)
+++ sling/trunk/contrib/extensions/urlrewriter/README.md Mon Jun  2 20:45:28 
2014
@@ -0,0 +1,19 @@
+Apache Sling URL Rewriter
+=========================
+
+multi-purpose service for altering HTTP requests/responses based on Tuckey's 
UrlRewriteFilter
+
+* http://tuckey.org/urlrewrite/manual/4.0/guide.html
+* 
http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html
+
+example for setting a Cache-Control header:
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" 
"http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd";>
+    <urlrewrite>
+      <rule>
+        <from>.*</from>
+        <set type="response-header" name="Cache-Control">max-age=600</set>
+      </rule>
+    </urlrewrite>
+

Added: sling/trunk/contrib/extensions/urlrewriter/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/urlrewriter/pom.xml?rev=1599355&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/urlrewriter/pom.xml (added)
+++ sling/trunk/contrib/extensions/urlrewriter/pom.xml Mon Jun  2 20:45:28 2014
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.sling</groupId>
+    <artifactId>sling</artifactId>
+    <version>19</version>
+    <relativePath>../../../parent/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>org.apache.sling.urlrewriter</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <packaging>bundle</packaging>
+
+  <name>Apache Sling URL Rewriter</name>
+  <description>Apache Sling URL Rewriter</description>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <sling.java.version>6</sling.java.version>
+  </properties>
+
+  <scm>
+    
<connection>scm:svn:http://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/urlrewriter</connection>
+    
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/urlrewriter</developerConnection>
+    
<url>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/urlrewriter</url>
+  </scm>
+
+  <dependencies>
+    <!-- javax -->
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <!-- OSGi -->
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <!-- Apache Commons -->
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>2.4</version>
+      <scope>provided</scope>
+    </dependency>
+    <!-- Apache Sling -->
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.engine</artifactId>
+      <version>2.3.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.commons.osgi</artifactId>
+      <version>2.2.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <!-- Apache Felix -->
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.scr.annotations</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <!-- UrlRewriteFilter -->
+    <dependency>
+      <groupId>org.tuckey</groupId>
+      <artifactId>urlrewritefilter</artifactId>
+      <version>4.0.4</version>
+      <scope>provided</scope>
+    </dependency>
+    <!-- logging -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.7.7</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.1</version>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Bundle-Category>sling</Bundle-Category>
+            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+            <Export-Package/>
+            <Embed-Dependency>
+              
org.apache.sling.commons.osgi;inline="org/apache/sling/commons/osgi/PropertiesUtil.*"
+            </Embed-Dependency>
+            <_removeheaders>
+              Embed-Dependency,
+              Private-Package,
+              Include-Resource
+            </_removeheaders>
+          </instructions>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-scr-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>

Added: 
sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/sling/urlrewriter/SlingUrlRewriteFilter.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/sling/urlrewriter/SlingUrlRewriteFilter.java?rev=1599355&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/sling/urlrewriter/SlingUrlRewriteFilter.java
 (added)
+++ 
sling/trunk/contrib/extensions/urlrewriter/src/main/java/org/apache/sling/urlrewriter/SlingUrlRewriteFilter.java
 Mon Jun  2 20:45:28 2014
@@ -0,0 +1,220 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.urlrewriter;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Dictionary;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Modified;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.engine.EngineConstants;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tuckey.web.filters.urlrewrite.Conf;
+import org.tuckey.web.filters.urlrewrite.UrlRewriter;
+import org.tuckey.web.filters.urlrewrite.utils.Log;
+import org.tuckey.web.filters.urlrewrite.utils.StringUtils;
+import org.w3c.dom.Document;
+import org.xml.sax.helpers.DefaultHandler;
+
+@Component(
+    name = "org.apache.sling.urlrewriter.SlingUrlRewriteFilter",
+    label = "%org.apache.sling.urlrewriter.label",
+    description = "%org.apache.sling.urlrewriter.description",
+    immediate = true,
+    metatype = true
+)
+@Service
+@Properties({
+    @Property(name = Constants.SERVICE_VENDOR, value = "The Apache Software 
Foundation"),
+    @Property(name = Constants.SERVICE_DESCRIPTION, value = "multi-purpose 
service for altering HTTP requests/responses based on Tuckey's 
UrlRewriteFilter"),
+    @Property(name = Constants.SERVICE_RANKING, intValue = 0, propertyPrivate 
= false),
+    @Property(name = EngineConstants.SLING_FILTER_SCOPE, value = 
{EngineConstants.FILTER_SCOPE_REQUEST, EngineConstants.FILTER_SCOPE_FORWARD})
+})
+public class SlingUrlRewriteFilter implements Filter {
+
+    private UrlRewriter rewriter;
+
+    public static final String DEFAULT_REWRITE_RULES = "<?xml version=\"1.0\" 
encoding=\"utf-8\"?><!DOCTYPE urlrewrite PUBLIC \"-//tuckey.org//DTD UrlRewrite 
4.0//EN\" \"http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd\";><urlrewrite/>";
+
+    @Property(value = DEFAULT_REWRITE_RULES)
+    public static final String REWRITE_RULES_PARAMETER = 
"org.apache.sling.urlrewriter.rewrite.rules";
+
+    private final Logger logger = 
LoggerFactory.getLogger(SlingUrlRewriteFilter.class);
+
+    public SlingUrlRewriteFilter() {
+        Log.setLevel("SLF4J");
+    }
+
+    @Activate
+    private void activate(final ComponentContext context) {
+        logger.debug("activate");
+        configure(context);
+    }
+
+    @Modified
+    private void modified(final ComponentContext context) {
+        logger.debug("modified");
+        configure(context);
+    }
+
+    @Deactivate
+    private void deactivate() {
+        logger.debug("deactivate");
+        clearRewriter();
+    }
+
+    private synchronized void configure(final ComponentContext context) {
+        logger.info("configuring URL rewriter");
+        final Dictionary properties = context.getProperties();
+        final String rules = 
PropertiesUtil.toString(properties.get(REWRITE_RULES_PARAMETER), 
DEFAULT_REWRITE_RULES);
+
+        final Document document = createDocument(rules);
+        if (document == null) {
+            logger.error("creating rules document failed");
+            return;
+        }
+
+        final Conf conf = new DocumentConf(document);
+        conf.initialise();
+        clearRewriter();
+
+        if (conf.isOk()) {
+            logger.info("rewrite configuration is ok");
+        } else {
+            logger.error("rewrite configuration is NOT ok");
+            return;
+        }
+
+        rewriter = new UrlRewriter(conf);
+        logger.info("rewrite engine is enabled: {}", conf.isEngineEnabled());
+        if (conf.getRules() != null) {
+            logger.info("number of rewrite rules: {}", conf.getRules().size());
+        } else {
+            logger.info("no rewrite rules");
+        }
+    }
+
+    @Override
+    public void destroy() {
+        logger.debug("destroy()");
+    }
+
+    @Override
+    public void init(final FilterConfig filterConfig) throws ServletException {
+        logger.debug("init({})", filterConfig);
+    }
+
+    @Override
+    public void doFilter(final ServletRequest servletRequest, final 
ServletResponse servletResponse, final FilterChain filterChain) throws 
IOException, ServletException {
+        logger.debug("do filter");
+        if (rewriter != null && servletRequest instanceof HttpServletRequest 
&& servletResponse instanceof HttpServletResponse) {
+            final HttpServletRequest httpServletRequest = (HttpServletRequest) 
servletRequest;
+            final HttpServletResponse httpServletResponse = 
(HttpServletResponse) servletResponse;
+            final boolean handled = 
rewriter.processRequest(httpServletRequest, httpServletResponse, filterChain);
+            if (handled) {
+                logger.debug("request handled by rewriter");
+                return;
+            }
+        }
+        logger.debug("request NOT handled by rewriter");
+        filterChain.doFilter(servletRequest, servletResponse);
+    }
+
+    private Document createDocument(final String rules) {
+        if (StringUtils.isBlank(rules)) {
+            logger.warn("given rules are blank");
+            return null;
+        }
+
+        final DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance();
+        factory.setValidating(true);
+        factory.setNamespaceAware(true);
+        factory.setIgnoringComments(true);
+        factory.setIgnoringElementContentWhitespace(true);
+
+        try {
+            final String systemId = "";
+            final ConfHandler confHandler = new ConfHandler(systemId);
+            final DocumentBuilder documentBuilder = 
factory.newDocumentBuilder();
+            documentBuilder.setErrorHandler(confHandler);
+            documentBuilder.setEntityResolver(confHandler);
+
+            final InputStream inputStream = new 
ByteArrayInputStream(rules.getBytes("UTF-8"));
+            final Document document = documentBuilder.parse(inputStream); // , 
systemId);
+            IOUtils.closeQuietly(inputStream);
+            return document;
+        } catch (Exception e) {
+            logger.error("error creating document from rules property", e);
+            return null;
+        }
+    }
+
+    private synchronized void clearRewriter() {
+        if (rewriter != null) {
+            rewriter.destroy();
+            rewriter = null;
+        }
+    }
+
+    public class DocumentConf extends Conf {
+
+        public DocumentConf(final Document rules) {
+            processConfDoc(rules);
+            // TODO check docProcessed
+            initialise();
+            // TODO set loadedDate
+        }
+
+    }
+
+    // TODO
+    public class ConfHandler extends DefaultHandler {
+
+        protected final String systemId;
+
+        public ConfHandler(final String systemId) {
+            this.systemId = systemId;
+        }
+
+    }
+
+}

Added: 
sling/trunk/contrib/extensions/urlrewriter/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/urlrewriter/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1599355&view=auto
==============================================================================
--- 
sling/trunk/contrib/extensions/urlrewriter/src/main/resources/OSGI-INF/metatype/metatype.properties
 (added)
+++ 
sling/trunk/contrib/extensions/urlrewriter/src/main/resources/OSGI-INF/metatype/metatype.properties
 Mon Jun  2 20:45:28 2014
@@ -0,0 +1,29 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#
+
+service.ranking.name = service ranking
+service.ranking.description = service property for identifying the service's 
ranking number
+
+sling.filter.scope.name = filter scopes
+sling.filter.scope.description = see 
http://sling.apache.org/documentation/the-sling-engine/filters.html
+
+org.apache.sling.urlrewriter.label = Apache Sling URL Rewriter
+org.apache.sling.urlrewriter.description = multi-purpose service for altering 
HTTP requests/responses based on Tuckey's UrlRewriteFilter
+org.apache.sling.urlrewriter.rewrite.rules.name = rewrite rules 
(urlrewrite.xml)
+org.apache.sling.urlrewriter.rewrite.rules.description = see 
http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#configuration


Reply via email to