Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Replace Tuckey UrlRewriteFilter with OCPSoft Rewrite
Browse files Browse the repository at this point in the history
This should fix the handling of dswid parameters and make it much
easier to maintain bidirectional URL mappings.
  • Loading branch information
seanf committed Feb 9, 2016
1 parent be6094d commit 7c19ab1
Show file tree
Hide file tree
Showing 10 changed files with 127 additions and 555 deletions.
3 changes: 2 additions & 1 deletion pom.xml
Expand Up @@ -33,7 +33,7 @@
<!-- Applies to surefire and failsafe (if enabled) -->
<failIfNoTests>true</failIfNoTests>

<deltaspike.version>1.5.1</deltaspike.version>
<deltaspike.version>1.5.3</deltaspike.version>
<cdi.runtime>runtime</cdi.runtime>
<cdi.compile>compile</cdi.compile>
<picketlink.version>2.5.4.SP4</picketlink.version>
Expand All @@ -47,6 +47,7 @@
<lombok.source.dir>${project.build.sourceDirectory}/org/zanata</lombok.source.dir>
<lucene.version>3.6.2</lucene.version>
<org.mock-server.version>3.9.17</org.mock-server.version>
<rewrite.version>3.0.0.Alpha10</rewrite.version>

<!--
Version of java compiler used for building. (Specified as major.minor,
Expand Down
8 changes: 3 additions & 5 deletions zanata-war/pom.xml
Expand Up @@ -172,8 +172,6 @@
<usedDependency>org.codehaus.jackson:jackson-xc</usedDependency>
<!-- Used for email unit tests -->
<usedDependency>org.jvnet.mock-javamail:mock-javamail</usedDependency>
<!-- Needed for urlrewrite.xml impl -->
<usedDependency>org.tuckey:urlrewritefilter</usedDependency>
<!-- Need for test scope -->
<usedDependency>${jdbc.groupId}:${jdbc.artifactId}</usedDependency>
<!-- Required for jboss startup at org.jboss.seam.init.Initialization.initComponentsFromXmlDocuments(Initialization.java:205) -->
Expand Down Expand Up @@ -1768,9 +1766,9 @@
</dependency>

<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>4.0.4</version>
<groupId>org.ocpsoft.rewrite</groupId>
<artifactId>rewrite-servlet</artifactId>
<version>${rewrite.version}</version>
</dependency>

<dependency>
Expand Down
Expand Up @@ -71,6 +71,7 @@ protected final <T extends Throwable> void handle(ExceptionEvent<T> event,
messages.clear();
messages.addFromResourceBundle(severity, messageKey, messageArgs);
urlUtil.redirectTo(redirectUrl);
// TODO urlUtil.forwardTo(redirectPath);

// required - "stops" the JSF lifecycle
FacesContext.getCurrentInstance().responseComplete();
Expand Down
Expand Up @@ -18,7 +18,6 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tuckey.web.filters.urlrewrite.Run;
import org.zanata.security.SimpleGroup;
import org.zanata.security.SimplePrincipal;
import org.zanata.security.ZanataIdentity;
Expand Down
112 changes: 112 additions & 0 deletions zanata-war/src/main/java/org/zanata/servlet/UrlRewriteConfig.java
@@ -0,0 +1,112 @@
package org.zanata.servlet;

import org.ocpsoft.rewrite.annotation.RewriteConfiguration;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.config.Direction;
import org.ocpsoft.rewrite.servlet.config.Forward;
import org.ocpsoft.rewrite.servlet.config.HttpConfigurationProvider;
import org.ocpsoft.rewrite.servlet.config.Path;
import org.ocpsoft.rewrite.servlet.config.Redirect;
import org.ocpsoft.rewrite.servlet.config.rule.Join;

import javax.servlet.ServletContext;

/*
* This class replaces urlrewrite.xml, with simpler bidirectional mappings for external/internal URLs.
*/

// TODO copy comments from urlrewrite.xml
// TODO delete urlrewrite.xml and tuckey dependency
@RewriteConfiguration
public class UrlRewriteConfig extends HttpConfigurationProvider {

@Override
public Configuration getConfiguration(final ServletContext context) {
String contextPath = context.getContextPath();
// NB: inbound rules are processed in order, outbound rules in reverse order (as of Rewrite 3.0.0.Alpha1)
return ConfigurationBuilder.begin()

// TODO test this
.addRule()
.when(Direction.isInbound().and(Path.matches("/seam/resource/restv1/{path}")))
.perform(Forward.to("/rest/{path}"))
.where("path").matches(".*")

.addRule()
.when(Direction.isInbound().and(Path.matches("/iteration/files/{projectSlug}/{iterationSlug}")))
.perform(Redirect.permanent(contextPath + "/iteration/view/{projectSlug}/{iterationSlug}/documents"))

.addRule()
.when(Direction.isInbound().and(Path.matches("/iteration/source_files/{projectSlug}/{iterationSlug}")))
.perform(Redirect.permanent(contextPath + "/iteration/view/{projectSlug}/{iterationSlug}/documents"))


.addRule(Join.path("/").to("/home.seam"))
.addRule(Join.path("/account/activate/{key}").to("/account/activate.seam"))
//.addRule(Join.path("/account/changepassword").to("/account/changepassword.seam"))
.addRule(Join.path("/account/google_password_reset_request").to("/account/google_password_reset_request.seam"))
.addRule(Join.path("/account/password_reset/{key}").to("/account/password_reset.seam"))
.addRule(Join.path("/account/password_reset_request").to("/account/password_reset_request.seam"))
.addRule(Join.path("/account/inactive").to("/account/inactive_account.seam"))
.addRule(Join.path("/account/klogin").to("/account/klogin.seam"))
.addRule(Join.path("/account/sign_in").to("/account/login.seam"))
.addRule(Join.path("/account/register").to("/account/register.seam"))
.addRule(Join.path("/account/sign_out").to("/account/logout.seam"))
.addRule(Join.path("/account/validate_email/{key}").to("/account/email_validation.seam"))
.addRule(Join.path("/admin/").to("/admin/home.seam"))
.addRule(Join.pathNonBinding("/admin/{page}").to("/admin/{page}.seam"))
.addRule(Join.path("/dashboard/").to("/dashboard/home.seam"))
.addRule(Join.path("/error/").to("/error.seam"))
.addRule(Join.pathNonBinding("/error/{path}").to("/error/{path}.seam"))
.addRule(Join.path("/glossary/").to("/glossary/view.seam"))
//.addRule(Join.path("/help/view").to("/help/view.seam"))
.addRule(Join.path("/iteration/view/{projectSlug}/{iterationSlug}").to("/iteration/view.seam"))
.addRule(Join.path("/iteration/view/{projectSlug}/{iterationSlug}/{section}").to("/iteration/view.seam")).when(Direction.isInbound())
/* JSF serves zanata-assets with suffix of .seam only.
This is to make sure any reference to zanata-assets
without .seam can access the resource.
e.g. jars/assets/style.css forwards to
jars/assets/style.css.seam
*/
.addRule(Join.path("/javax.faces.resource/jars/assets/{path}")
.to("/javax.faces.resource/jars/assets/{path}.seam"))
.when(Direction.isInbound())
.where("path").matches(".*(?<!.seam)")

.addRule(Join.path("/language/list/").to("/language/home.seam"))
.addRule(Join.path("/language/view/{id}").to("/language/language.seam"))
.addRule(Join.path("/profile/").to("/profile/home.seam"))
.addRule(Join.path("/profile/add_identity").to("/profile/add_identity.seam"))
.addRule(Join.path("/profile/create").to("/profile/create_user.seam"))
.addRule(Join.path("/profile/edit").to("/profile/edit.seam"))
.addRule(Join.path("/profile/merge_account").to("/profile/merge_account.seam"))
.addRule(Join.path("/profile/view/{username}").to("/profile/home.seam"))
.addRule(Join.path("/project/add_iteration/{projectSlug}").to("/project/add_iteration.seam"))
.addRule(Join.path("/project/add_iteration/{projectSlug}/{copyFromVersionSlug}").to("/project/add_iteration.seam"))
.addRule(Join.path("/project/create").to("/project/create_project.seam"))
.addRule(Join.path("/project/list/").to("/project/home.seam"))
.addRule(Join.path("/project/view/{slug}").to("/project/project.seam"))
.addRule(Join.path("/project/view/{slug}/{section}").to("/project/project.seam")).when(Direction.isInbound())
// generate zanata.xml config
.addRule(Join.path("/project/view/{projectSlug}/iter/{iterationSlug}/config/").
to("/project/project.seam?actionMethod=project%2Fproject.xhtml%3AconfigurationAction.getData"))
// TODO fix this
.addRule(Join.path("/rest/").to("/rest/index.xrd"))
.addRule(Join.path("/search/{query}").to("/search.seam"))
// Translation Memory
.addRule(Join.path("/tm/").to("/tm/home.seam"))
.addRule(Join.path("/tm/create").to("/tm/create.seam"))
.addRule(Join.path("/version-group/create").to("/version-group/create_version_group.seam"))
.addRule(Join.path("/version-group/list/").to("/version-group/home.seam"))
.addRule(Join.path("/version-group/view/{versionGroupSlug}").to("/version-group/version_group.seam"))
.addRule(Join.path("/webtrans/Application.html").to("/webtrans/Application.seam")).when(Direction.isInbound())
.addRule(Join.path("/webtrans/translate").to("/webtrans/Application.seam"))
;
}

@Override
public int priority() {
return 0;
}
}
58 changes: 0 additions & 58 deletions zanata-war/src/main/webapp-jboss/WEB-INF/web.xml
Expand Up @@ -211,55 +211,11 @@
<url-pattern>/*</url-pattern>
</filter-mapping>

<!--<filter>-->
<!--<filter-name>Seam Filter</filter-name>-->
<!--<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>-->
<!--</filter>-->

<!--<filter-mapping>-->
<!--<filter-name>Seam Filter</filter-name>-->
<!--<url-pattern>/*</url-pattern>-->
<!--</filter-mapping>-->

<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>slf4j</param-value>
</init-param>
<init-param>
<param-name>statusPath</param-name>
<param-value>/rwstatus</param-value>
</init-param>

<init-param>
<param-name>statusEnabled</param-name>
<param-value>true</param-value>
</init-param>

</filter>

<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- <servlet-mapping> -->
<!-- <servlet-name>javax.ws.rs.core.Application</servlet-name> -->
<!-- <url-pattern>/seam/resource/restv1/*</url-pattern> -->
<!-- </servlet-mapping> -->

<!--<servlet>-->
<!--<servlet-name>Seam Resource Servlet</servlet-name>-->
<!--<servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>-->
<!--</servlet>-->

<!--<servlet-mapping>-->
<!--<servlet-name>Seam Resource Servlet</servlet-name>-->
<!--<url-pattern>/seam/resource/*</url-pattern>-->
<!--</servlet-mapping>-->

<!-- Facelets development mode (disable in production)
To use it, add the following to $JBOSS_HOME/server/$profile/deployers/jbossweb.deployer/web.xml :-->

Expand Down Expand Up @@ -328,20 +284,6 @@
<url-pattern>/files/upload/*</url-pattern>
</servlet-mapping>

<!-- Uncomment this to enable the H2Console
<servlet>
<servlet-name>H2Console</servlet-name>
<servlet-class>org.h2.server.web.WebServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>H2Console</servlet-name>
<url-pattern>/console/*</url-pattern>
</servlet-mapping>
-->

<security-constraint>
<display-name>Restrict raw XHTML Documents</display-name>
<web-resource-collection>
Expand Down
1 change: 1 addition & 0 deletions zanata-war/src/main/webapp/WEB-INF/faces-config.xml
Expand Up @@ -344,6 +344,7 @@
</redirect>
</navigation-case>
<navigation-case>
<from-outcome>persisted</from-outcome>
<to-view-id>/iteration/view.xhtml</to-view-id>
<redirect>
<view-param>
Expand Down
9 changes: 5 additions & 4 deletions zanata-war/src/main/webapp/WEB-INF/template/banner.xhtml
Expand Up @@ -161,12 +161,13 @@
class="is-hidden--s button">#{msgs['jsf.Signup']}</a>
</ui:fragment>

<h:outputLink id="signin_link"
value="#{request.contextPath}/account/sign_in?continue=#{urlUtil.getEncodedLocalUrl(request)}"
<h:link id="signin_link"
outcome="/account/login.xhtml"
value="#{msgs['jsf.Login']}"
propagation="none" styleClass="l--push-left-half button--primary"
rendered="#{applicationConfigurationAction.loginHandledByInternalPage}">
#{msgs['jsf.Login']}
</h:outputLink>
<f:param name="continue" value="#{urlUtil.getEncodedLocalUrl(request)}"/>
</h:link>

<h:form rendered="#{applicationConfigurationAction.singleOpenId}" styleClass="bx--inline">
<h:commandLink id="openid_single_signin_link"
Expand Down

0 comments on commit 7c19ab1

Please sign in to comment.