You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by mo...@apache.org on 2017/09/08 15:15:12 UTC

[19/24] knox git commit: Merge branch 'master' into KNOX-998-Package_Restructuring

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-server/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryTest.java
----------------------------------------------------------------------
diff --cc gateway-server/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryTest.java
index 2f2ea9b,0000000..2973f40
mode 100644,000000..100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryTest.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/deploy/DeploymentFactoryTest.java
@@@ -1,324 -1,0 +1,324 @@@
 +/**
 + * 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.knox.gateway.deploy;
 +
 +import java.io.IOException;
 +import javax.xml.parsers.ParserConfigurationException;
 +import javax.xml.transform.TransformerException;
 +
 +import org.apache.knox.gateway.config.GatewayConfig;
 +import org.apache.knox.gateway.config.impl.GatewayConfigImpl;
 +import org.apache.knox.gateway.topology.Application;
 +import org.apache.knox.gateway.topology.Service;
 +import org.apache.knox.gateway.topology.Topology;
 +import org.apache.knox.gateway.util.XmlUtils;
 +import org.apache.hadoop.test.TestUtils;
 +import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
 +import org.junit.Test;
 +import org.w3c.dom.Document;
 +import org.xml.sax.SAXException;
 +
- import static junit.framework.TestCase.fail;
 +import static org.hamcrest.MatcherAssert.assertThat;
 +import static org.hamcrest.core.IsEqual.equalTo;
 +import static org.hamcrest.xml.HasXPath.hasXPath;
++import static org.junit.Assert.fail;
 +
 +public class DeploymentFactoryTest {
 +
 +  @Test( timeout = TestUtils.MEDIUM_TIMEOUT )
 +  public void testEmptyTopology() throws IOException, SAXException, ParserConfigurationException, TransformerException {
 +    GatewayConfig config = new GatewayConfigImpl();
 +
 +    Topology topology = new Topology();
 +    topology.setName( "test-topology" );
 +
 +    EnterpriseArchive archive = DeploymentFactory.createDeployment( config, topology );
 +
 +    Document xml = XmlUtils.readXml( archive.get( "/META-INF/topology.xml" ).getAsset().openStream() );
 +    assertThat( xml, hasXPath( "/topology/gateway" ) );
 +    assertThat( xml, hasXPath( "/topology/name", equalTo( "test-topology" ) ) );
 +  }
 +
 +  @Test( timeout = TestUtils.SHORT_TIMEOUT )
 +  public void test_validateNoAppsWithRootUrlsInServicesTopology() {
 +    DeploymentFactory.validateNoAppsWithRootUrlsInServicesTopology( null );
 +
 +    Topology topology = new Topology();
 +    topology.setName( "test-topology" );
 +    DeploymentFactory.validateNoAppsWithRootUrlsInServicesTopology( topology );
 +
 +    Service service;
 +    Application application;
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    service = new Service();
 +    service.setName( "test-service" );
 +    service.setRole( "test-service" );
 +    topology.addService( service );
 +    application = new Application();
 +    application.setName( "test-application" );
 +    topology.addApplication( application );
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    service = new Service();
 +    service.setName( "test-service" );
 +    service.setRole( "test-service" );
 +    topology.addService( service );
 +    application = new Application();
 +    application.setName( "test-application" );
 +    application.addUrl( "" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithRootUrlsInServicesTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    service = new Service();
 +    service.setName( "test-service" );
 +    service.setRole( "test-service" );
 +    topology.addService( service );
 +    application = new Application();
 +    application.setName( "test-application" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithRootUrlsInServicesTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    service = new Service();
 +    service.setName( "test-service" );
 +    service.setRole( "test-service" );
 +    topology.addService( service );
 +    application = new Application();
 +    application.setName( "test-application" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithRootUrlsInServicesTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    service = new Service();
 +    service.setName( "test-service" );
 +    service.setRole( "test-service" );
 +    topology.addService( service );
 +    application = new Application();
 +    application.setName( "test-application" );
 +    application.addUrl( "/test-application" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithRootUrlsInServicesTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +  }
 +
 +  @Test( timeout = TestUtils.SHORT_TIMEOUT )
 +  public void test_validateNoAppsWithDuplicateUrlsInTopology() {
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( null );
 +
 +    Topology topology = new Topology();
 +    topology.setName( "test-topology" );
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +
 +    Application application;
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    topology.addApplication( application );
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/test-application-2" );
 +    topology.addApplication( application );
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    application.addUrl( "/test-application-1" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/test-application-2" );
 +    topology.addApplication( application );
 +    DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    application.addUrl( "/test-application-dup" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/test-application-dup" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    application.addUrl( "" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/test-application-1" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +    topology = new Topology();
 +    topology.setName( "test-topology" );
 +    application = new Application();
 +    application.setName( "test-application-1" );
 +    application.addUrl( "/test-application-1" );
 +    application.addUrl( "/test-application-3" );
 +    topology.addApplication( application );
 +    application = new Application();
 +    application.setName( "test-application-2" );
 +    application.addUrl( "/test-application-2" );
 +    application.addUrl( "/test-application-3" );
 +    topology.addApplication( application );
 +    try {
 +      DeploymentFactory.validateNoAppsWithDuplicateUrlsInTopology( topology );
 +      fail( "Expected DeploymentException" );
 +    } catch ( DeploymentException e ) {
 +      // Expected.
 +    }
 +
 +  }
 +
 +}

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-service-admin/src/main/java/org/apache/knox/gateway/service/admin/TopologiesResource.java
----------------------------------------------------------------------
diff --cc gateway-service-admin/src/main/java/org/apache/knox/gateway/service/admin/TopologiesResource.java
index 60c566d,0000000..1861490
mode 100644,000000..100644
--- a/gateway-service-admin/src/main/java/org/apache/knox/gateway/service/admin/TopologiesResource.java
+++ b/gateway-service-admin/src/main/java/org/apache/knox/gateway/service/admin/TopologiesResource.java
@@@ -1,312 -1,0 +1,312 @@@
 +/**
 + * 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.knox.gateway.service.admin;
 +
 +import org.apache.knox.gateway.service.admin.beans.BeanConverter;
 +import org.apache.knox.gateway.service.admin.beans.Topology;
 +import org.apache.knox.gateway.services.GatewayServices;
 +import org.apache.knox.gateway.config.GatewayConfig;
 +import org.apache.knox.gateway.services.topology.TopologyService;
 +
 +import javax.servlet.http.HttpServletRequest;
 +import javax.ws.rs.Consumes;
 +import javax.ws.rs.DELETE;
 +import javax.ws.rs.GET;
 +import javax.ws.rs.PUT;
 +import javax.ws.rs.Path;
 +import javax.ws.rs.PathParam;
 +import javax.ws.rs.Produces;
 +import javax.ws.rs.core.Context;
 +import javax.ws.rs.core.Response;
 +import javax.xml.bind.annotation.XmlAccessType;
 +import javax.xml.bind.annotation.XmlAccessorType;
 +import javax.xml.bind.annotation.XmlElement;
 +import javax.xml.bind.annotation.XmlElementWrapper;
 +import java.net.URI;
 +import java.net.URISyntaxException;
 +import java.util.ArrayList;
 +import java.util.Collections;
 +import java.util.Comparator;
 +import java.util.List;
 +
 +import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 +import static javax.ws.rs.core.MediaType.APPLICATION_XML;
 +import static javax.ws.rs.core.Response.ok;
 +
 +@Path("/api/v1")
 +public class TopologiesResource {
 +  @Context
 +  private HttpServletRequest request;
 +
 +  @GET
 +  @Produces({APPLICATION_JSON, APPLICATION_XML})
 +  @Path("topologies/{id}")
 +  public Topology getTopology(@PathParam("id") String id) {
 +    GatewayServices services = (GatewayServices) request.getServletContext()
 +        .getAttribute(GatewayServices.GATEWAY_SERVICES_ATTRIBUTE);
 +    GatewayConfig config = (GatewayConfig) request.getServletContext().getAttribute(GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE);
 +
 +    TopologyService ts = services.getService(GatewayServices.TOPOLOGY_SERVICE);
 +
 +    for (org.apache.knox.gateway.topology.Topology t : ts.getTopologies()) {
 +      if(t.getName().equals(id)) {
 +        try {
 +          t.setUri(new URI( buildURI(t, config, request) ));
 +        } catch (URISyntaxException se) {
 +          t.setUri(null);
 +        }
 +        return BeanConverter.getTopology(t);
 +      }
 +    }
 +    return null;
 +  }
 +
 +  @GET
 +  @Produces({APPLICATION_JSON, APPLICATION_XML})
 +  @Path("topologies")
 +  public SimpleTopologyWrapper getTopologies() {
 +    GatewayServices services = (GatewayServices) request.getServletContext()
 +        .getAttribute(GatewayServices.GATEWAY_SERVICES_ATTRIBUTE);
 +
 +
 +    TopologyService ts = services.getService(GatewayServices.TOPOLOGY_SERVICE);
 +
 +    ArrayList<SimpleTopology> st = new ArrayList<SimpleTopology>();
 +    GatewayConfig conf = (GatewayConfig) request.getServletContext().getAttribute(GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE);
 +
 +    for (org.apache.knox.gateway.topology.Topology t : ts.getTopologies()) {
 +      st.add(getSimpleTopology(t, conf));
 +    }
 +
 +    Collections.sort(st, new TopologyComparator());
 +    SimpleTopologyWrapper stw = new SimpleTopologyWrapper();
 +
 +    for(SimpleTopology t : st){
 +      stw.topologies.add(t);
 +    }
 +
 +    return stw;
 +
 +  }
 +
 +  @PUT
 +  @Consumes({APPLICATION_JSON, APPLICATION_XML})
 +  @Path("topologies/{id}")
 +  public Topology uploadTopology(@PathParam("id") String id, Topology t) {
 +
 +    GatewayServices gs = (GatewayServices) request.getServletContext()
 +        .getAttribute(GatewayServices.GATEWAY_SERVICES_ATTRIBUTE);
 +
 +    t.setName(id);
 +    TopologyService ts = gs.getService(GatewayServices.TOPOLOGY_SERVICE);
 +
 +    ts.deployTopology(BeanConverter.getTopology(t));
 +
 +    return getTopology(id);
 +  }
 +
 +  @DELETE
 +  @Produces(APPLICATION_JSON)
 +  @Path("topologies/{id}")
 +  public Response deleteTopology(@PathParam("id") String id) {
 +    boolean deleted = false;
-     if(!id.equals("admin")) {
++    if(!"admin".equals(id)) {
 +      GatewayServices services = (GatewayServices) request.getServletContext()
 +          .getAttribute(GatewayServices.GATEWAY_SERVICES_ATTRIBUTE);
 +
 +      TopologyService ts = services.getService(GatewayServices.TOPOLOGY_SERVICE);
 +
 +      for (org.apache.knox.gateway.topology.Topology t : ts.getTopologies()) {
 +        if(t.getName().equals(id)) {
 +          ts.deleteTopology(t);
 +          deleted = true;
 +        }
 +      }
 +    }else{
 +      deleted = false;
 +    }
 +    return ok().entity("{ \"deleted\" : " + deleted + " }").build();
 +  }
 +
 +
 +  private static class TopologyComparator implements Comparator<SimpleTopology> {
 +    @Override
 +    public int compare(SimpleTopology t1, SimpleTopology t2) {
 +      return t1.getName().compareTo(t2.getName());
 +    }
 +  }
 +
 +   String buildURI(org.apache.knox.gateway.topology.Topology topology, GatewayConfig config, HttpServletRequest req){
 +    String uri = buildXForwardBaseURL(req);
 +
 +//    Strip extra context
 +    uri = uri.replace(req.getContextPath(), "");
 +
 +//    Add the gateway path
 +    String gatewayPath;
 +    if(config.getGatewayPath() != null){
 +      gatewayPath = config.getGatewayPath();
 +    }else{
 +      gatewayPath = "gateway";
 +    }
 +    uri += "/" + gatewayPath;
 +
 +    uri += "/" + topology.getName();
 +    return uri;
 +  }
 +
 +   String buildHref(org.apache.knox.gateway.topology.Topology t, HttpServletRequest req) {
 +    String href = buildXForwardBaseURL(req);
 +//    Make sure that the pathInfo doesn't have any '/' chars at the end.
 +    String pathInfo = req.getPathInfo();
 +    if(pathInfo.endsWith("/")) {
 +      while(pathInfo.endsWith("/")) {
 +        pathInfo = pathInfo.substring(0, pathInfo.length() - 1);
 +      }
 +    }
 +
 +    href += pathInfo + "/" + t.getName();
 +    return href;
 +  }
 +
 +  private SimpleTopology getSimpleTopology(
 +      org.apache.knox.gateway.topology.Topology t, GatewayConfig config) {
 +    String uri = buildURI(t, config, request);
 +    String href = buildHref(t, request);
 +    return new SimpleTopology(t, uri, href);
 +  }
 +
 +  private String buildXForwardBaseURL(HttpServletRequest req){
 +    final String X_Forwarded = "X-Forwarded-";
 +    final String X_Forwarded_Context = X_Forwarded + "Context";
 +    final String X_Forwarded_Proto = X_Forwarded + "Proto";
 +    final String X_Forwarded_Host = X_Forwarded + "Host";
 +    final String X_Forwarded_Port = X_Forwarded + "Port";
 +    final String X_Forwarded_Server = X_Forwarded + "Server";
 +
 +    String baseURL = "";
 +
 +//    Get Protocol
 +    if(req.getHeader(X_Forwarded_Proto) != null){
 +      baseURL += req.getHeader(X_Forwarded_Proto) + "://";
 +    } else {
 +      baseURL += req.getProtocol() + "://";
 +    }
 +
 +//    Handle Server/Host and Port Here
 +    if (req.getHeader(X_Forwarded_Host) != null && req.getHeader(X_Forwarded_Port) != null){
 +//        Double check to see if host has port
 +      if(req.getHeader(X_Forwarded_Host).contains(req.getHeader(X_Forwarded_Port))){
 +        baseURL += req.getHeader(X_Forwarded_Host);
 +      } else {
 +//        If there's no port, add the host and port together;
 +        baseURL += req.getHeader(X_Forwarded_Host) + ":" + req.getHeader(X_Forwarded_Port);
 +      }
 +    } else if(req.getHeader(X_Forwarded_Server) != null && req.getHeader(X_Forwarded_Port) != null){
 +//      Tack on the server and port if they're available. Try host if server not available
 +      baseURL += req.getHeader(X_Forwarded_Server) + ":" + req.getHeader(X_Forwarded_Port);
 +    } else if(req.getHeader(X_Forwarded_Port) != null) {
 +//      if we at least have a port, we can use it.
 +      baseURL += req.getServerName() + ":" + req.getHeader(X_Forwarded_Port);
 +    } else {
 +//      Resort to request members
 +      baseURL += req.getServerName() + ":" + req.getLocalPort();
 +    }
 +
 +//    Handle Server context
 +    if( req.getHeader(X_Forwarded_Context) != null ) {
 +      baseURL += req.getHeader( X_Forwarded_Context );
 +    } else {
 +      baseURL += req.getContextPath();
 +    }
 +
 +    return baseURL;
 +  }
 +
 +  @XmlAccessorType(XmlAccessType.NONE)
 +  public static class SimpleTopology {
 +
 +    @XmlElement
 +    private String name;
 +    @XmlElement
 +    private String timestamp;
 +    @XmlElement
 +    private String uri;
 +    @XmlElement
 +    private String href;
 +
 +    public SimpleTopology() {}
 +
 +    public SimpleTopology(org.apache.knox.gateway.topology.Topology t, String uri, String href) {
 +      this.name = t.getName();
 +      this.timestamp = Long.toString(t.getTimestamp());
 +      this.uri = uri;
 +      this.href = href;
 +    }
 +
 +    public String getName() {
 +      return name;
 +    }
 +
 +    public void setName(String n) {
 +      name = n;
 +    }
 +
 +    public String getTimestamp() {
 +      return timestamp;
 +    }
 +
 +    public void setTimestamp(String timestamp) {
 +      this.timestamp = timestamp;
 +    }
 +
 +    public String getUri() {
 +      return uri;
 +    }
 +
 +    public void setUri(String uri) {
 +      this.uri = uri;
 +    }
 +
 +    public String getHref() {
 +      return href;
 +    }
 +
 +    public void setHref(String href) {
 +      this.href = href;
 +    }
 +  }
 +
 +  @XmlAccessorType(XmlAccessType.FIELD)
 +  public static class SimpleTopologyWrapper{
 +
 +    @XmlElement(name="topology")
 +    @XmlElementWrapper(name="topologies")
 +    private List<SimpleTopology> topologies = new ArrayList<SimpleTopology>();
 +
 +    public List<SimpleTopology> getTopologies(){
 +      return topologies;
 +    }
 +
 +    public void setTopologies(List<SimpleTopology> ts){
 +      this.topologies = ts;
 +    }
 +
 +  }
 +}
 +

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-service-rm/src/test/java/org/apache/knox/gateway/rm/dispatch/RMHaDispatchTest.java
----------------------------------------------------------------------
diff --cc gateway-service-rm/src/test/java/org/apache/knox/gateway/rm/dispatch/RMHaDispatchTest.java
index c0cf8d0,0000000..722fb1c
mode 100644,000000..100644
--- a/gateway-service-rm/src/test/java/org/apache/knox/gateway/rm/dispatch/RMHaDispatchTest.java
+++ b/gateway-service-rm/src/test/java/org/apache/knox/gateway/rm/dispatch/RMHaDispatchTest.java
@@@ -1,219 -1,0 +1,224 @@@
 +/**
 + * 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
 + * <p>
 + * http://www.apache.org/licenses/LICENSE-2.0
 + * <p>
 + * 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.knox.gateway.rm.dispatch;
 +
 +import org.apache.knox.gateway.ha.provider.HaDescriptor;
 +import org.apache.knox.gateway.ha.provider.HaProvider;
 +import org.apache.knox.gateway.ha.provider.HaServletContextListener;
 +import org.apache.knox.gateway.ha.provider.impl.DefaultHaProvider;
 +import org.apache.knox.gateway.ha.provider.impl.HaDescriptorFactory;
 +import org.apache.http.client.methods.HttpRequestBase;
 +import org.apache.http.client.methods.HttpUriRequest;
- import org.apache.http.impl.client.DefaultHttpClient;
 +import org.apache.http.params.BasicHttpParams;
 +import org.apache.http.entity.StringEntity;
++import org.apache.http.impl.client.CloseableHttpClient;
++import org.apache.http.impl.client.HttpClientBuilder;
 +import org.apache.http.entity.ContentType;
 +import org.apache.http.Header;
 +import org.apache.http.message.BasicHttpResponse;
 +import org.apache.http.ProtocolVersion;
 +import org.apache.http.StatusLine;
 +import org.apache.http.message.BasicStatusLine;
 +import org.apache.http.message.BasicHeader;
 +import org.easymock.EasyMock;
 +import org.easymock.IAnswer;
 +import org.junit.Assert;
 +import org.junit.Test;
 +
 +import javax.servlet.FilterConfig;
 +import javax.servlet.ServletContext;
 +import javax.servlet.WriteListener;
 +import javax.servlet.ServletOutputStream;
 +import javax.servlet.http.HttpServletRequest;
 +import javax.servlet.http.HttpServletResponse;
 +import java.io.IOException;
 +import java.net.URI;
 +import java.util.ArrayList;
 +import java.util.concurrent.atomic.AtomicInteger;
 +
 +public class RMHaDispatchTest {
 +    private static final String LOCATION = "Location";
 +
 +    @Test
 +    public void testConnectivityFailure() throws Exception {
 +        String serviceName = "RESOURCEMANAGER";
 +        HaDescriptor descriptor = HaDescriptorFactory.createDescriptor();
 +        descriptor.addServiceConfig(HaDescriptorFactory.createServiceConfig(serviceName, "true", "1", "1000", "2", "1000", null, null));
 +        HaProvider provider = new DefaultHaProvider(descriptor);
 +        URI uri1 = new URI("http://unreachable-host");
 +        URI uri2 = new URI("http://reachable-host");
 +        ArrayList<String> urlList = new ArrayList<>();
 +        urlList.add(uri1.toString());
 +        urlList.add(uri2.toString());
 +        provider.addHaService(serviceName, urlList);
 +        FilterConfig filterConfig = EasyMock.createNiceMock(FilterConfig.class);
 +        ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class);
 +
 +        EasyMock.expect(filterConfig.getServletContext()).andReturn(servletContext).anyTimes();
 +        EasyMock.expect(servletContext.getAttribute(HaServletContextListener.PROVIDER_ATTRIBUTE_NAME)).andReturn(provider).anyTimes();
 +
 +        BasicHttpParams params = new BasicHttpParams();
 +
 +        HttpUriRequest outboundRequest = EasyMock.createNiceMock(HttpRequestBase.class);
 +        EasyMock.expect(outboundRequest.getMethod()).andReturn("GET").anyTimes();
 +        EasyMock.expect(outboundRequest.getURI()).andReturn(uri1).anyTimes();
 +        EasyMock.expect(outboundRequest.getParams()).andReturn(params).anyTimes();
 +
 +        HttpServletRequest inboundRequest = EasyMock.createNiceMock(HttpServletRequest.class);
 +        EasyMock.expect(inboundRequest.getRequestURL()).andReturn(new StringBuffer(uri2.toString())).once();
 +        EasyMock.expect(inboundRequest.getAttribute("dispatch.ha.failover.counter")).andReturn(new AtomicInteger(0)).once();
 +        EasyMock.expect(inboundRequest.getAttribute("dispatch.ha.failover.counter")).andReturn(new AtomicInteger(1)).once();
 +
 +        HttpServletResponse outboundResponse = EasyMock.createNiceMock(HttpServletResponse.class);
 +        EasyMock.expect(outboundResponse.getOutputStream()).andAnswer(new IAnswer<ServletOutputStream>() {
 +            @Override
 +            public ServletOutputStream answer() throws Throwable {
 +                return new ServletOutputStream() {
 +                    @Override
 +                    public void write(int b) throws IOException {
 +                        throw new IOException("unreachable-host");
 +                    }
 +
 +                    @Override
 +                    public void setWriteListener(WriteListener arg0) {
 +                    }
 +
 +                    @Override
 +                    public boolean isReady() {
 +                        return false;
 +                    }
 +                };
 +            }
 +        }).once();
 +        EasyMock.replay(filterConfig, servletContext, outboundRequest, inboundRequest, outboundResponse);
 +        Assert.assertEquals(uri1.toString(), provider.getActiveURL(serviceName));
 +        RMHaDispatch dispatch = new RMHaDispatch();
-         dispatch.setHttpClient(new DefaultHttpClient());
++        HttpClientBuilder builder = HttpClientBuilder.create();
++        CloseableHttpClient client = builder.build();
++        dispatch.setHttpClient(client);
 +        dispatch.setHaProvider(provider);
 +        dispatch.init();
 +        long startTime = System.currentTimeMillis();
 +        try {
 +            dispatch.executeRequest(outboundRequest, inboundRequest, outboundResponse);
 +        } catch (IOException e) {
 +            //this is expected after the failover limit is reached
 +        }
 +        long elapsedTime = System.currentTimeMillis() - startTime;
 +        Assert.assertEquals(uri2.toString(), provider.getActiveURL(serviceName));
 +        //test to make sure the sleep took place
 +        Assert.assertTrue(elapsedTime > 1000);
 +    }
 +
 +    @Test
 +    public void testConnectivityFailover() throws Exception {
 +        String serviceName = "RESOURCEMANAGER";
 +        HaDescriptor descriptor = HaDescriptorFactory.createDescriptor();
 +        descriptor.addServiceConfig(HaDescriptorFactory.createServiceConfig(serviceName, "true", "1", "1000", "2", "1000", null, null));
 +        HaProvider provider = new DefaultHaProvider(descriptor);
 +        URI uri1 = new URI("http://passive-host");
 +        URI uri2 = new URI("http://other-host");
 +        URI uri3 = new URI("http://active-host");
 +        ArrayList<String> urlList = new ArrayList<>();
 +        urlList.add(uri1.toString());
 +        urlList.add(uri2.toString());
 +        urlList.add(uri3.toString());
 +        provider.addHaService(serviceName, urlList);
 +        FilterConfig filterConfig = EasyMock.createNiceMock(FilterConfig.class);
 +        ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class);
 +
 +        EasyMock.expect(filterConfig.getServletContext()).andReturn(servletContext).anyTimes();
 +        EasyMock.expect(servletContext.getAttribute(HaServletContextListener.PROVIDER_ATTRIBUTE_NAME)).andReturn(provider).anyTimes();
 +
 +
 +        BasicHttpResponse inboundResponse = EasyMock.createNiceMock(BasicHttpResponse.class);
 +        EasyMock.expect(inboundResponse.getStatusLine()).andReturn(getStatusLine()).anyTimes();
 +        EasyMock.expect(inboundResponse.getEntity()).andReturn(getResponseEntity()).anyTimes();
 +        EasyMock.expect(inboundResponse.getFirstHeader(LOCATION)).andReturn(getFirstHeader(uri3.toString())).anyTimes();
 +
 +        BasicHttpParams params = new BasicHttpParams();
 +
 +        HttpUriRequest outboundRequest = EasyMock.createNiceMock(HttpRequestBase.class);
 +        EasyMock.expect(outboundRequest.getMethod()).andReturn("GET").anyTimes();
 +        EasyMock.expect(outboundRequest.getURI()).andReturn(uri1).anyTimes();
 +        EasyMock.expect(outboundRequest.getParams()).andReturn(params).anyTimes();
 +
 +        HttpServletRequest inboundRequest = EasyMock.createNiceMock(HttpServletRequest.class);
 +        EasyMock.expect(inboundRequest.getRequestURL()).andReturn(new StringBuffer(uri2.toString())).once();
 +        EasyMock.expect(inboundRequest.getAttribute("dispatch.ha.failover.counter")).andReturn(new AtomicInteger(0)).once();
 +        EasyMock.expect(inboundRequest.getAttribute("dispatch.ha.failover.counter")).andReturn(new AtomicInteger(1)).once();
 +
 +        HttpServletResponse outboundResponse = EasyMock.createNiceMock(HttpServletResponse.class);
 +        EasyMock.expect(outboundResponse.getOutputStream()).andAnswer(new IAnswer<ServletOutputStream>() {
 +            @Override
 +            public ServletOutputStream answer() throws Throwable {
 +                return new ServletOutputStream() {
 +                    @Override
 +                    public void write(int b) throws IOException {
 +                        throw new IOException("unreachable-host");
 +                    }
 +
 +                    @Override
 +                    public void setWriteListener(WriteListener arg0) {
 +                    }
 +
 +                    @Override
 +                    public boolean isReady() {
 +                        return false;
 +                    }
 +                };
 +            }
 +        }).once();
 +        Assert.assertEquals(uri1.toString(), provider.getActiveURL(serviceName));
 +        EasyMock.replay(filterConfig, servletContext, inboundResponse, outboundRequest, inboundRequest, outboundResponse);
 +
 +        RMHaDispatch dispatch = new RMHaDispatch();
-         dispatch.setHttpClient(new DefaultHttpClient());
++        HttpClientBuilder builder = HttpClientBuilder.create();
++        CloseableHttpClient client = builder.build();
++        dispatch.setHttpClient(client);
 +        dispatch.setHaProvider(provider);
 +        dispatch.init();
 +        long startTime = System.currentTimeMillis();
 +        try {
 +            dispatch.setInboundResponse(inboundResponse);
 +            dispatch.executeRequest(outboundRequest, inboundRequest, outboundResponse);
 +        } catch (IOException e) {
 +            //this is expected after the failover limit is reached
 +        }
 +        Assert.assertEquals(uri3.toString(), dispatch.getUriFromInbound(inboundRequest, inboundResponse, null).toString());
 +        long elapsedTime = System.currentTimeMillis() - startTime;
 +        Assert.assertEquals(uri3.toString(), provider.getActiveURL(serviceName));
 +        //test to make sure the sleep took place
 +        Assert.assertTrue(elapsedTime > 1000);
 +    }
 +
 +    private StringEntity getResponseEntity() {
 +        String body = "This is standby RM";
 +        return new StringEntity(body, ContentType.TEXT_HTML);
 +    }
 +
 +    private StatusLine getStatusLine() {
 +        ProtocolVersion p = new ProtocolVersion("HTTP", 1, 1);
 +        return new BasicStatusLine(p, 307, "Code" + 307);
 +    }
 +
 +    private Header getFirstHeader(String host) {
 +        return new BasicHeader(LOCATION, host);
 +    }
 +
 +}

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-service-webhdfs/src/test/java/org/apache/knox/gateway/hdfs/dispatch/WebHdfsHaDispatchTest.java
----------------------------------------------------------------------
diff --cc gateway-service-webhdfs/src/test/java/org/apache/knox/gateway/hdfs/dispatch/WebHdfsHaDispatchTest.java
index 7c03d32,0000000..6b7260b
mode 100644,000000..100644
--- a/gateway-service-webhdfs/src/test/java/org/apache/knox/gateway/hdfs/dispatch/WebHdfsHaDispatchTest.java
+++ b/gateway-service-webhdfs/src/test/java/org/apache/knox/gateway/hdfs/dispatch/WebHdfsHaDispatchTest.java
@@@ -1,105 -1,0 +1,108 @@@
 +/**
 + * 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.knox.gateway.hdfs.dispatch;
 +
 +import org.apache.knox.gateway.ha.provider.HaDescriptor;
 +import org.apache.knox.gateway.ha.provider.HaProvider;
 +import org.apache.knox.gateway.ha.provider.HaServletContextListener;
 +import org.apache.knox.gateway.ha.provider.impl.DefaultHaProvider;
 +import org.apache.knox.gateway.ha.provider.impl.HaDescriptorFactory;
 +import org.apache.knox.gateway.servlet.SynchronousServletOutputStreamAdapter;
 +import org.apache.http.client.methods.HttpRequestBase;
 +import org.apache.http.client.methods.HttpUriRequest;
- import org.apache.http.impl.client.DefaultHttpClient;
++import org.apache.http.impl.client.CloseableHttpClient;
++import org.apache.http.impl.client.HttpClientBuilder;
 +import org.apache.http.params.BasicHttpParams;
 +import org.easymock.EasyMock;
 +import org.easymock.IAnswer;
 +import org.junit.Assert;
 +import org.junit.Test;
 +
 +import javax.servlet.FilterConfig;
 +import javax.servlet.ServletContext;
 +import javax.servlet.http.HttpServletRequest;
 +import javax.servlet.http.HttpServletResponse;
 +import java.io.IOException;
 +import java.net.URI;
 +import java.util.ArrayList;
 +import java.util.concurrent.atomic.AtomicInteger;
 +
 +public class WebHdfsHaDispatchTest {
 +
 +   @Test
 +   public void testConnectivityFailover() throws Exception {
 +      String serviceName = "WEBHDFS";
 +      HaDescriptor descriptor = HaDescriptorFactory.createDescriptor();
 +      descriptor.addServiceConfig(HaDescriptorFactory.createServiceConfig(serviceName, "true", "1", "1000", "2", "1000", null, null));
 +      HaProvider provider = new DefaultHaProvider(descriptor);
 +      URI uri1 = new URI( "http://unreachable-host" );
 +      URI uri2 = new URI( "http://reachable-host" );
 +      ArrayList<String> urlList = new ArrayList<String>();
 +      urlList.add(uri1.toString());
 +      urlList.add(uri2.toString());
 +      provider.addHaService(serviceName, urlList);
 +      FilterConfig filterConfig = EasyMock.createNiceMock(FilterConfig.class);
 +      ServletContext servletContext = EasyMock.createNiceMock(ServletContext.class);
 +
 +      EasyMock.expect(filterConfig.getServletContext()).andReturn(servletContext).anyTimes();
 +      EasyMock.expect(servletContext.getAttribute(HaServletContextListener.PROVIDER_ATTRIBUTE_NAME)).andReturn(provider).anyTimes();
 +
 +      BasicHttpParams params = new BasicHttpParams();
 +
 +      HttpUriRequest outboundRequest = EasyMock.createNiceMock(HttpRequestBase.class);
 +      EasyMock.expect(outboundRequest.getMethod()).andReturn( "GET" ).anyTimes();
 +      EasyMock.expect(outboundRequest.getURI()).andReturn( uri1  ).anyTimes();
 +      EasyMock.expect(outboundRequest.getParams()).andReturn( params ).anyTimes();
 +
 +      HttpServletRequest inboundRequest = EasyMock.createNiceMock(HttpServletRequest.class);
 +      EasyMock.expect(inboundRequest.getRequestURL()).andReturn( new StringBuffer(uri2.toString()) ).once();
 +      EasyMock.expect(inboundRequest.getAttribute("dispatch.ha.failover.counter")).andReturn(new AtomicInteger(0)).once();
 +      EasyMock.expect(inboundRequest.getAttribute("dispatch.ha.failover.counter")).andReturn(new AtomicInteger(1)).once();
 +
 +      HttpServletResponse outboundResponse = EasyMock.createNiceMock(HttpServletResponse.class);
 +      EasyMock.expect(outboundResponse.getOutputStream()).andAnswer( new IAnswer<SynchronousServletOutputStreamAdapter>() {
 +         @Override
 +         public SynchronousServletOutputStreamAdapter answer() throws Throwable {
 +            return new SynchronousServletOutputStreamAdapter() {
 +               @Override
 +               public void write( int b ) throws IOException {
 +                  throw new IOException( "unreachable-host" );
 +               }
 +            };
 +         }
 +      }).once();
 +      EasyMock.replay(filterConfig, servletContext, outboundRequest, inboundRequest, outboundResponse);
 +      Assert.assertEquals(uri1.toString(), provider.getActiveURL(serviceName));
 +      WebHdfsHaDispatch dispatch = new WebHdfsHaDispatch();
-       dispatch.setHttpClient(new DefaultHttpClient());
++      HttpClientBuilder builder = HttpClientBuilder.create();
++      CloseableHttpClient client = builder.build();
++      dispatch.setHttpClient(client);
 +      dispatch.setHaProvider(provider);
 +      dispatch.init();
 +      long startTime = System.currentTimeMillis();
 +      try {
 +         dispatch.executeRequest(outboundRequest, inboundRequest, outboundResponse);
 +      } catch (IOException e) {
 +        //this is expected after the failover limit is reached
 +      }
 +      long elapsedTime = System.currentTimeMillis() - startTime;
 +      Assert.assertEquals(uri2.toString(), provider.getActiveURL(serviceName));
 +      //test to make sure the sleep took place
 +      Assert.assertTrue(elapsedTime > 1000);
 +   }
 +}

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-spi/src/main/java/org/apache/knox/gateway/security/SubjectUtils.java
----------------------------------------------------------------------
diff --cc gateway-spi/src/main/java/org/apache/knox/gateway/security/SubjectUtils.java
index b630750,0000000..3fc51ee
mode 100644,000000..100644
--- a/gateway-spi/src/main/java/org/apache/knox/gateway/security/SubjectUtils.java
+++ b/gateway-spi/src/main/java/org/apache/knox/gateway/security/SubjectUtils.java
@@@ -1,96 -1,0 +1,96 @@@
 +/**
 + * 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.knox.gateway.security;
 +
 +import javax.security.auth.Subject;
 +import java.security.AccessController;
 +import java.security.Principal;
 +import java.util.Set;
 +
 +/**
 + * General utility methods for interrogating the standard java Subject
 + */
 +public class SubjectUtils {
 +  
 +  public static Subject getCurrentSubject() {
 +    return Subject.getSubject( AccessController.getContext() );
 +  }
 +
 +  public static String getPrimaryPrincipalName(Subject subject) {
 +    String name = null;
 +
 +    Set<PrimaryPrincipal> primaryPrincipals = subject.getPrincipals(PrimaryPrincipal.class);
-     if (primaryPrincipals.size() > 0) {
++    if (!primaryPrincipals.isEmpty()) {
 +      return ((PrimaryPrincipal)primaryPrincipals.toArray()[0]).getName();
 +    }
 +
 +    // LJM TODO: this implementation assumes the first one found.
 +    // We should configure through context param based on knowledge
 +    // of the authentication provider in use
 +    Set<Principal> principals = subject.getPrincipals();
 +    for (Principal p : principals) {
 +      name = p.getName();
 +      break;
 +    }
 +    
 +    return name;
 +  }
 +  
 +  public static boolean isImpersonating(Subject subject) {
 +    boolean impersonating = false;
 +    
 +    impersonating = (subject.getPrincipals(ImpersonatedPrincipal.class).size() > 0);
 +    
 +    return impersonating;
 +  }
 +
 +  public static String getImpersonatedPrincipalName(Subject subject) {
 +    String name = null;
 +
 +    Set<ImpersonatedPrincipal> impPrincipals = subject.getPrincipals(ImpersonatedPrincipal.class);
-     if (impPrincipals.size() > 0) {
++    if (!impPrincipals.isEmpty()) {
 +      return ((Principal)impPrincipals.toArray()[0]).getName();
 +    }
 +    
 +    return name;
 +  }
 +  
 +  public static String getEffectivePrincipalName(Subject subject) {
 +    String name = null;
 +    
 +    name = getImpersonatedPrincipalName(subject);
 +    if (name == null) {
 +      name = getPrimaryPrincipalName(subject);
 +    }
 +    
 +    return name;
 +  }
 +
 +  public static String getCurrentEffectivePrincipalName() {
 +    String name = null;
 +    Subject subject = getCurrentSubject();
 +    if( subject != null ) {
 +      name = getImpersonatedPrincipalName( subject );
 +      if (name == null) {
 +        name = getPrimaryPrincipalName(subject);
 +      }
 +    }
 +    return name;
 +  }
 +
 +}

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-spi/src/test/java/org/apache/knox/gateway/dispatch/DefaultDispatchTest.java
----------------------------------------------------------------------
diff --cc gateway-spi/src/test/java/org/apache/knox/gateway/dispatch/DefaultDispatchTest.java
index 4c71abb,0000000..99e3a33
mode 100644,000000..100644
--- a/gateway-spi/src/test/java/org/apache/knox/gateway/dispatch/DefaultDispatchTest.java
+++ b/gateway-spi/src/test/java/org/apache/knox/gateway/dispatch/DefaultDispatchTest.java
@@@ -1,234 -1,0 +1,244 @@@
 +/**
 + * 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.knox.gateway.dispatch;
 +
 +import static org.hamcrest.CoreMatchers.is;
 +import static org.hamcrest.Matchers.containsString;
 +import static org.hamcrest.Matchers.greaterThan;
 +import static org.hamcrest.Matchers.instanceOf;
 +import static org.hamcrest.Matchers.not;
 +import static org.junit.Assert.assertFalse;
 +import static org.junit.Assert.assertTrue;
 +import static org.junit.Assert.assertEquals;
 +import static org.junit.Assert.assertThat;
 +import static org.junit.Assert.fail;
 +
 +import java.io.IOException;
 +import java.net.URI;
 +import java.net.URISyntaxException;
 +import java.net.UnknownHostException;
 +
 +import javax.servlet.ServletContext;
 +import javax.servlet.ServletInputStream;
 +import javax.servlet.http.HttpServletRequest;
 +import javax.servlet.http.HttpServletResponse;
 +
 +import org.apache.knox.gateway.config.GatewayConfig;
 +import org.apache.knox.gateway.servlet.SynchronousServletOutputStreamAdapter;
 +import org.apache.hadoop.test.TestUtils;
 +import org.apache.hadoop.test.category.FastTests;
 +import org.apache.hadoop.test.category.UnitTests;
 +import org.apache.http.HttpEntity;
++import org.apache.http.HttpVersion;
++import org.apache.http.RequestLine;
 +import org.apache.http.client.methods.HttpUriRequest;
- import org.apache.http.impl.client.DefaultHttpClient;
++import org.apache.http.impl.client.CloseableHttpClient;
++import org.apache.http.impl.client.HttpClientBuilder;
 +import org.apache.http.params.BasicHttpParams;
 +import org.easymock.EasyMock;
 +import org.easymock.IAnswer;
 +import org.junit.Test;
 +import org.junit.experimental.categories.Category;
 +
 +@Category( { UnitTests.class, FastTests.class } )
 +public class DefaultDispatchTest {
 +
 +  // Make sure Hadoop cluster topology isn't exposed to client when there is a connectivity issue.
 +  @Test
 +  public void testJiraKnox58() throws URISyntaxException, IOException {
 +
 +    URI uri = new URI( "http://unreachable-host" );
 +    BasicHttpParams params = new BasicHttpParams();
 +
 +    HttpUriRequest outboundRequest = EasyMock.createNiceMock( HttpUriRequest.class );
 +    EasyMock.expect( outboundRequest.getMethod() ).andReturn( "GET" ).anyTimes();
 +    EasyMock.expect( outboundRequest.getURI() ).andReturn( uri  ).anyTimes();
++
++    RequestLine requestLine = EasyMock.createNiceMock( RequestLine.class );
++    EasyMock.expect( requestLine.getMethod() ).andReturn( "GET" ).anyTimes();
++    EasyMock.expect( requestLine.getProtocolVersion() ).andReturn( HttpVersion.HTTP_1_1 ).anyTimes();
++    EasyMock.expect( outboundRequest.getRequestLine() ).andReturn( requestLine ).anyTimes();
 +    EasyMock.expect( outboundRequest.getParams() ).andReturn( params ).anyTimes();
 +
 +    HttpServletRequest inboundRequest = EasyMock.createNiceMock( HttpServletRequest.class );
 +
 +    HttpServletResponse outboundResponse = EasyMock.createNiceMock( HttpServletResponse.class );
 +    EasyMock.expect( outboundResponse.getOutputStream() ).andAnswer( new IAnswer<SynchronousServletOutputStreamAdapter>() {
 +      @Override
 +      public SynchronousServletOutputStreamAdapter answer() throws Throwable {
 +        return new SynchronousServletOutputStreamAdapter() {
 +          @Override
 +          public void write( int b ) throws IOException {
 +            throw new IOException( "unreachable-host" );
 +          }
 +        };
 +      }
 +    });
 +
-     EasyMock.replay( outboundRequest, inboundRequest, outboundResponse );
++    EasyMock.replay( outboundRequest, inboundRequest, outboundResponse, requestLine );
 +
 +    DefaultDispatch dispatch = new DefaultDispatch();
-     dispatch.setHttpClient(new DefaultHttpClient());
++    HttpClientBuilder builder = HttpClientBuilder.create();
++    CloseableHttpClient client = builder.build();
++    dispatch.setHttpClient(client);
 +    try {
 +      dispatch.executeRequest( outboundRequest, inboundRequest, outboundResponse );
 +      fail( "Should have thrown IOException" );
 +    } catch( IOException e ) {
 +      assertThat( e.getMessage(), not( containsString( "unreachable-host" ) ) );
 +      assertThat( e, not( instanceOf( UnknownHostException.class ) ) ) ;
 +      assertThat( "Message needs meaningful content.", e.getMessage().trim().length(), greaterThan( 12 ) );
 +    }
 +  }
 +
 +  @Test
 +  public void testCallToSecureClusterWithDelegationToken() throws URISyntaxException, IOException {
 +    DefaultDispatch defaultDispatch = new DefaultDispatch();
 +    ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
 +    GatewayConfig gatewayConfig = EasyMock.createNiceMock( GatewayConfig.class );
 +    EasyMock.expect(gatewayConfig.isHadoopKerberosSecured()).andReturn(true).anyTimes();
 +    EasyMock.expect( servletContext.getAttribute( GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE ) ).andReturn( gatewayConfig ).anyTimes();
 +    ServletInputStream inputStream = EasyMock.createNiceMock( ServletInputStream.class );
 +    HttpServletRequest inboundRequest = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect(inboundRequest.getQueryString()).andReturn( "delegation=123").anyTimes();
 +    EasyMock.expect(inboundRequest.getInputStream()).andReturn( inputStream).anyTimes();
 +    EasyMock.expect(inboundRequest.getServletContext()).andReturn( servletContext ).anyTimes();
 +    EasyMock.replay( gatewayConfig, servletContext, inboundRequest );
 +    HttpEntity httpEntity = defaultDispatch.createRequestEntity(inboundRequest);
 +    assertFalse("buffering in the presence of delegation token",
 +        (httpEntity instanceof PartiallyRepeatableHttpEntity));
 +  }
 +
 +  @Test
 +  public void testCallToNonSecureClusterWithoutDelegationToken() throws URISyntaxException, IOException {
 +    DefaultDispatch defaultDispatch = new DefaultDispatch();
 +    ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
 +    GatewayConfig gatewayConfig = EasyMock.createNiceMock( GatewayConfig.class );
 +    EasyMock.expect(gatewayConfig.isHadoopKerberosSecured()).andReturn(false).anyTimes();
 +    EasyMock.expect( servletContext.getAttribute( GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE ) ).andReturn( gatewayConfig ).anyTimes();
 +    ServletInputStream inputStream = EasyMock.createNiceMock( ServletInputStream.class );
 +    HttpServletRequest inboundRequest = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect(inboundRequest.getInputStream()).andReturn( inputStream).anyTimes();
 +    EasyMock.expect(inboundRequest.getQueryString()).andReturn( "a=123").anyTimes();
 +    EasyMock.expect(inboundRequest.getServletContext()).andReturn( servletContext ).anyTimes();
 +    EasyMock.replay( gatewayConfig, servletContext, inboundRequest );
 +    HttpEntity httpEntity = defaultDispatch.createRequestEntity(inboundRequest);
 +    assertFalse("buffering in non secure cluster",
 +        (httpEntity instanceof PartiallyRepeatableHttpEntity));
 +  }
 +
 +  @Test
 +  public void testCallToSecureClusterWithoutDelegationToken() throws URISyntaxException, IOException {
 +    DefaultDispatch defaultDispatch = new DefaultDispatch();
 +    defaultDispatch.setReplayBufferSize(10);
 +    ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
 +    GatewayConfig gatewayConfig = EasyMock.createNiceMock( GatewayConfig.class );
 +    EasyMock.expect(gatewayConfig.isHadoopKerberosSecured()).andReturn( Boolean.TRUE ).anyTimes();
 +    EasyMock.expect( servletContext.getAttribute( GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE ) ).andReturn( gatewayConfig ).anyTimes();
 +    ServletInputStream inputStream = EasyMock.createNiceMock( ServletInputStream.class );
 +    HttpServletRequest inboundRequest = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect(inboundRequest.getQueryString()).andReturn( "a=123").anyTimes();
 +    EasyMock.expect(inboundRequest.getInputStream()).andReturn( inputStream).anyTimes();
 +    EasyMock.expect(inboundRequest.getServletContext()).andReturn( servletContext ).anyTimes();
 +    EasyMock.replay( gatewayConfig, servletContext, inboundRequest );
 +    HttpEntity httpEntity = defaultDispatch.createRequestEntity(inboundRequest);
 +    assertTrue("not buffering in the absence of delegation token",
 +        (httpEntity instanceof PartiallyRepeatableHttpEntity));
 +  }
 +
 +  @Test
 +  public void testUsingDefaultBufferSize() throws URISyntaxException, IOException {
 +    DefaultDispatch defaultDispatch = new DefaultDispatch();
 +    ServletContext servletContext = EasyMock.createNiceMock( ServletContext.class );
 +    GatewayConfig gatewayConfig = EasyMock.createNiceMock( GatewayConfig.class );
 +    EasyMock.expect(gatewayConfig.isHadoopKerberosSecured()).andReturn( Boolean.TRUE ).anyTimes();
 +    EasyMock.expect(gatewayConfig.getHttpServerRequestBuffer()).andReturn( 16384 ).anyTimes();
 +    EasyMock.expect( servletContext.getAttribute( GatewayConfig.GATEWAY_CONFIG_ATTRIBUTE ) ).andReturn( gatewayConfig ).anyTimes();
 +    ServletInputStream inputStream = EasyMock.createNiceMock( ServletInputStream.class );
 +    HttpServletRequest inboundRequest = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect(inboundRequest.getQueryString()).andReturn( "a=123").anyTimes();
 +    EasyMock.expect(inboundRequest.getInputStream()).andReturn( inputStream).anyTimes();
 +    EasyMock.expect(inboundRequest.getServletContext()).andReturn( servletContext ).anyTimes();
 +    EasyMock.replay( gatewayConfig, servletContext, inboundRequest );
 +    HttpEntity httpEntity = defaultDispatch.createRequestEntity(inboundRequest);
 +    assertTrue("not buffering in the absence of delegation token",
 +        (httpEntity instanceof PartiallyRepeatableHttpEntity));
 +    assertEquals(defaultDispatch.getReplayBufferSize(), 16);
 +    assertEquals(defaultDispatch.getReplayBufferSizeInBytes(), 16384);
 +
 +    //also test normal setter and getters
 +    defaultDispatch.setReplayBufferSize(-1);
 +    assertEquals(defaultDispatch.getReplayBufferSizeInBytes(), -1);
 +    assertEquals(defaultDispatch.getReplayBufferSize(), -1);
 +
 +    defaultDispatch.setReplayBufferSize(16);
 +    assertEquals(defaultDispatch.getReplayBufferSizeInBytes(), 16384);
 +    assertEquals(defaultDispatch.getReplayBufferSize(), 16);
 +
 +  }
 +
 +  @Test( timeout = TestUtils.SHORT_TIMEOUT )
 +  public void testGetDispatchUrl() throws Exception {
 +    HttpServletRequest request;
 +    Dispatch dispatch;
 +    String path;
 +    String query;
 +    URI uri;
 +
 +    dispatch = new DefaultDispatch();
 +
 +    path = "http://test-host:42/test-path";
 +    request = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect( request.getRequestURI() ).andReturn( path ).anyTimes();
 +    EasyMock.expect( request.getRequestURL() ).andReturn( new StringBuffer( path ) ).anyTimes();
 +    EasyMock.expect( request.getQueryString() ).andReturn( null ).anyTimes();
 +    EasyMock.replay( request );
 +    uri = dispatch.getDispatchUrl( request );
 +    assertThat( uri.toASCIIString(), is( "http://test-host:42/test-path" ) );
 +
 +    path = "http://test-host:42/test,path";
 +    request = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect( request.getRequestURI() ).andReturn( path ).anyTimes();
 +    EasyMock.expect( request.getRequestURL() ).andReturn( new StringBuffer( path ) ).anyTimes();
 +    EasyMock.expect( request.getQueryString() ).andReturn( null ).anyTimes();
 +    EasyMock.replay( request );
 +    uri = dispatch.getDispatchUrl( request );
 +    assertThat( uri.toASCIIString(), is( "http://test-host:42/test,path" ) );
 +
 +    path = "http://test-host:42/test%2Cpath";
 +    request = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect( request.getRequestURI() ).andReturn( path ).anyTimes();
 +    EasyMock.expect( request.getRequestURL() ).andReturn( new StringBuffer( path ) ).anyTimes();
 +    EasyMock.expect( request.getQueryString() ).andReturn( null ).anyTimes();
 +    EasyMock.replay( request );
 +    uri = dispatch.getDispatchUrl( request );
 +    assertThat( uri.toASCIIString(), is( "http://test-host:42/test%2Cpath" ) );
 +
 +    path = "http://test-host:42/test%2Cpath";
 +    query = "test%26name=test%3Dvalue";
 +    request = EasyMock.createNiceMock( HttpServletRequest.class );
 +    EasyMock.expect( request.getRequestURI() ).andReturn( path ).anyTimes();
 +    EasyMock.expect( request.getRequestURL() ).andReturn( new StringBuffer( path ) ).anyTimes();
 +    EasyMock.expect( request.getQueryString() ).andReturn( query ).anyTimes();
 +    EasyMock.replay( request );
 +    uri = dispatch.getDispatchUrl( request );
 +    assertThat( uri.toASCIIString(), is( "http://test-host:42/test%2Cpath?test%26name=test%3Dvalue" ) );
 +
 +  }
 +
 +}

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-spi/src/test/java/org/apache/knox/gateway/security/principal/PrincipalMapperTest.java
----------------------------------------------------------------------
diff --cc gateway-spi/src/test/java/org/apache/knox/gateway/security/principal/PrincipalMapperTest.java
index 1be93c3,0000000..cba7f1c
mode 100644,000000..100644
--- a/gateway-spi/src/test/java/org/apache/knox/gateway/security/principal/PrincipalMapperTest.java
+++ b/gateway-spi/src/test/java/org/apache/knox/gateway/security/principal/PrincipalMapperTest.java
@@@ -1,232 -1,0 +1,232 @@@
 +/**
 + * 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.knox.gateway.security.principal;
 +
 +import org.apache.hadoop.test.category.FastTests;
 +import org.apache.hadoop.test.category.UnitTests;
 +import org.junit.Before;
 +import org.junit.Test;
 +import org.junit.experimental.categories.Category;
 +
 +import static org.junit.Assert.assertTrue;
 +import static org.junit.Assert.fail;
 +
 +/**
 +*
 +*/
 +@Category( { UnitTests.class, FastTests.class } )
 +public class PrincipalMapperTest {
 +  PrincipalMapper mapper;
 +
 +  @Before
 +  public void setup() {
 +    mapper = new SimplePrincipalMapper();
 +  }
 +
 +  @Test
 +  public void testSimplePrincipalMappingWithWildcardGroups() {
 +    String principalMapping = "";
 +    String groupMapping = "*=users";
 +    try {
 +      mapper.loadMappingTable(principalMapping, groupMapping);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      pme.printStackTrace();
 +      fail();
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("lmccay"));
 +    assertTrue(mapper.mapGroupPrincipal("hdfs")[0].equals("users"));
 +    assertTrue(mapper.mapGroupPrincipal("lmccay")[0].equals("users"));
 +  }
 +  
 +  @Test
 +  public void testSimplePrincipalMappingWithWildcardAndExplicitGroups() {
 +    String principalMapping = "";
 +    String groupMapping = "*=users;lmccay=mrgroup";
 +    try {
 +      mapper.loadMappingTable(principalMapping, groupMapping);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      pme.printStackTrace();
 +      fail();
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("lmccay"));
 +    assertTrue(mapper.mapGroupPrincipal("hdfs")[0].equals("users"));
 +    String group = mapper.mapGroupPrincipal("lmccay")[0];
-     assertTrue(group.equals("users") || group.equals("mrgroup"));
++    assertTrue("users".equals(group) || "mrgroup".equals(group));
 +    group = mapper.mapGroupPrincipal("lmccay")[1];
-     assertTrue(group.equals("users") || group.equals("mrgroup"));
++    assertTrue("users".equals(group) || "mrgroup".equals(group));
 +  }
 +
 +  @Test
 +  public void testSimplePrincipalMappingWithUserAndWildcardAndExplicitGroups() {
 +    String principalMapping = "guest=lmccay";
 +    String groupMapping = "*=users;lmccay=mrgroup";
 +    try {
 +      mapper.loadMappingTable(principalMapping, groupMapping);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      pme.printStackTrace();
 +      fail();
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("guest").equals("lmccay"));
 +    assertTrue(mapper.mapGroupPrincipal("hdfs").length == 1);
 +    assertTrue(mapper.mapGroupPrincipal("hdfs")[0].equals("users"));
 +    assertTrue(mapper.mapGroupPrincipal("lmccay").length == 2);
 +    String group = mapper.mapGroupPrincipal("lmccay")[0];
-     assertTrue(group.equals("users") || group.equals("mrgroup"));
++    assertTrue("users".equals(group) || "mrgroup".equals(group));
 +    group = mapper.mapGroupPrincipal("lmccay")[1];
-     assertTrue(group.equals("users") || group.equals("mrgroup"));
++    assertTrue("users".equals(group) || "mrgroup".equals(group));
 +  }
 +
 +  @Test
 +  public void testNonNullSimplePrincipalMappingWithGroups() {
 +    String principalMapping = "lmccay,kminder=hdfs;newuser=mapred";
 +    String groupMapping = "hdfs=group1;mapred=mrgroup,mrducks";
 +    try {
 +      mapper.loadMappingTable(principalMapping, groupMapping);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      pme.printStackTrace();
 +      fail();
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("hdfs"));
 +    assertTrue(mapper.mapGroupPrincipal("hdfs")[0].equals("group1"));
 +
 +    assertTrue(mapper.mapUserPrincipal("kminder").equals("hdfs"));
 +    
 +    assertTrue(mapper.mapUserPrincipal("newuser").equals("mapred"));
 +    assertTrue(mapper.mapGroupPrincipal("mapred")[0].equals("mrgroup"));
 +    assertTrue(mapper.mapGroupPrincipal("mapred")[1].equals("mrducks"));
 +
 +    assertTrue(mapper.mapUserPrincipal("hdfs").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("mapred").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("stink").equals("stink"));
 +  }
 +
 +  @Test
 +  public void testNonNullSimplePrincipalMapping() {
 +    String principalMapping = "lmccay,kminder=hdfs;newuser=mapred";
 +    try {
 +      mapper.loadMappingTable(principalMapping, null);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      pme.printStackTrace();
 +      fail();
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("kminder").equals("hdfs"));
 +    
 +    assertTrue(mapper.mapUserPrincipal("newuser").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("hdfs").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("mapred").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("stink").equals("stink"));
 +  }
 +
 +  @Test
 +  public void testNonNullEndingSemiColonSimplePrincipalMapping() {
 +    String principalMapping = "lmccay,kminder=hdfs;newuser=mapred;";
 +    try {
 +      mapper.loadMappingTable(principalMapping, null);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      fail();
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("kminder").equals("hdfs"));
 +    
 +    assertTrue(mapper.mapUserPrincipal("newuser").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("hdfs").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("mapred").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("stink").equals("stink"));
 +  }
 +
 +  @Test
 +  public void testNullSimplePrincipalMapping() {
 +    String principalMapping = null;
 +    try {
 +      mapper.loadMappingTable(principalMapping, null);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      fail();
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("lmccay"));
 +    assertTrue(mapper.mapUserPrincipal("kminder").equals("kminder"));
 +    
 +    assertTrue(mapper.mapUserPrincipal("newuser").equals("newuser"));
 +
 +    assertTrue(mapper.mapUserPrincipal("hdfs").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("mapred").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("stink").equals("stink"));
 +  }
 +
 +  @Test
 +  public void testInvalidSimplePrincipalMapping() {
 +    String principalMapping = "ksdlhfjkdshf;kjdshf";
 +    try {
 +      mapper.loadMappingTable(principalMapping, null);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      // expected
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("lmccay"));
 +    assertTrue(mapper.mapUserPrincipal("kminder").equals("kminder"));
 +    
 +    assertTrue(mapper.mapUserPrincipal("newuser").equals("newuser"));
 +
 +    assertTrue(mapper.mapUserPrincipal("hdfs").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("mapred").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("stink").equals("stink"));
 +  }
 +
 +  @Test
 +  public void testPartiallyInvalidSimplePrincipalMapping() {
 +    String principalMapping = "lmccay=hdfs;kjdshf";
 +    try {
 +      mapper.loadMappingTable(principalMapping, null);
 +    }
 +    catch (PrincipalMappingException pme) {
 +      // expected
 +    }
 +    
 +    assertTrue(mapper.mapUserPrincipal("lmccay").equals("lmccay"));
 +    assertTrue(mapper.mapUserPrincipal("kminder").equals("kminder"));
 +    
 +    assertTrue(mapper.mapUserPrincipal("newuser").equals("newuser"));
 +
 +    assertTrue(mapper.mapUserPrincipal("hdfs").equals("hdfs"));
 +    assertTrue(mapper.mapUserPrincipal("mapred").equals("mapred"));
 +
 +    assertTrue(mapper.mapUserPrincipal("stink").equals("stink"));
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/knox/blob/50f46e9e/gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
----------------------------------------------------------------------
diff --cc gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
index 49d697b,0000000..e7512b3
mode 100644,000000..100644
--- a/gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
+++ b/gateway-test-release-utils/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
@@@ -1,610 -1,0 +1,612 @@@
 +/**
 + * 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.knox.gateway;
 +
 +import org.apache.commons.lang.StringUtils;
 +import org.apache.hadoop.conf.Configuration;
 +import org.apache.knox.gateway.config.GatewayConfig;
 +
++import java.io.File;
 +import java.net.InetSocketAddress;
 +import java.net.UnknownHostException;
 +import java.util.ArrayList;
 +import java.util.List;
 +import java.util.Map;
 +import java.util.concurrent.ConcurrentHashMap;
 +
 +public class GatewayTestConfig extends Configuration implements GatewayConfig {
 +
 +  /* Websocket defaults */
 +  public static final boolean DEFAULT_WEBSOCKET_FEATURE_ENABLED = false;
 +  public static final int DEFAULT_WEBSOCKET_MAX_TEXT_MESSAGE_SIZE = Integer.MAX_VALUE;;
 +  public static final int DEFAULT_WEBSOCKET_MAX_BINARY_MESSAGE_SIZE = Integer.MAX_VALUE;;
 +  public static final int DEFAULT_WEBSOCKET_MAX_TEXT_MESSAGE_BUFFER_SIZE = 32768;
 +  public static final int DEFAULT_WEBSOCKET_MAX_BINARY_MESSAGE_BUFFER_SIZE = 32768;
 +  public static final int DEFAULT_WEBSOCKET_INPUT_BUFFER_SIZE = 4096;
 +  public static final int DEFAULT_WEBSOCKET_ASYNC_WRITE_TIMEOUT = 60000;
 +  public static final int DEFAULT_WEBSOCKET_IDLE_TIMEOUT = 300000;
 +
 +  private String gatewayHomeDir = "gateway-home";
 +  private String hadoopConfDir = "hadoop";
 +  private String gatewayHost = "localhost";
 +  private int gatewayPort = 0;
 +  private String gatewayPath = "gateway";
 +  private boolean hadoopKerberosSecured = false;
 +  private String kerberosConfig = "/etc/knox/conf/krb5.conf";
 +  private boolean kerberosDebugEnabled = false;
 +  private String kerberosLoginConfig = "/etc/knox/conf/krb5JAASLogin.conf";
 +  private String frontendUrl = null;
 +  private boolean xForwardedEnabled = true;
 +  private String gatewayApplicationsDir = null;
 +  private String gatewayServicesDir;
 +  private String defaultTopologyName = "default";
 +  private List<String> includedSSLCiphers = null;
 +  private List<String> excludedSSLCiphers = null;
 +  private boolean sslEnabled = false;
 +  private String truststoreType = "jks";
 +  private String keystoreType = "jks";
 +  private boolean isTopologyPortMappingEnabled = true;
 +  private ConcurrentHashMap<String, Integer> topologyPortMapping = new ConcurrentHashMap<>();
 +  private int backupVersionLimit = -1;
 +  private long backupAgeLimit = -1;
 +
 +  public void setGatewayHomeDir( String gatewayHomeDir ) {
 +    this.gatewayHomeDir = gatewayHomeDir;
 +  }
 +
 +  public String getGatewayHomeDir() {
 +    return this.gatewayHomeDir;
 +  }
 +
 +  @Override
 +  public String getGatewayConfDir() {
 +    return gatewayHomeDir;
 +  }
 +
 +  @Override
 +  public String getGatewayDataDir() {
 +    return gatewayHomeDir;
 +  }
 +
 +  @Override
 +  public String getGatewaySecurityDir() {
 +    return gatewayHomeDir + "/security";
 +  }
 +
 +  @Override
 +  public String getGatewayTopologyDir() {
 +    return gatewayHomeDir + "/topologies";
 +  }
 +
 +  @Override
 +  public String getGatewayDeploymentDir() {
 +    return gatewayHomeDir + "/deployments";
 +  }
 +
 +//  public void setDeploymentDir( String clusterConfDir ) {
 +//    this.deployDir = clusterConfDir;
 +//  }
 +
 +  @Override
 +  public String getHadoopConfDir() {
 +    return hadoopConfDir;
 +  }
 +
 +//  public void setHadoopConfDir( String hadoopConfDir ) {
 +//    this.hadoopConfDir = hadoopConfDir;
 +//  }
 +
 +  @Override
 +  public String getGatewayHost() {
 +    return gatewayHost;
 +  }
 +
 +//  public void setGatewayHost( String gatewayHost ) {
 +//    this.gatewayHost = gatewayHost;
 +//  }
 +
 +  @Override
 +  public int getGatewayPort() {
 +    return gatewayPort;
 +  }
 +
 +//  public void setGatewayPort( int gatewayPort ) {
 +//    this.gatewayPort = gatewayPort;
 +//  }
 +
 +  @Override
 +  public String getGatewayPath() {
 +    return gatewayPath;
 +  }
 +
 +  public void setGatewayPath( String gatewayPath ) {
 +    this.gatewayPath = gatewayPath;
 +  }
 +
 +  @Override
 +  public InetSocketAddress getGatewayAddress() throws UnknownHostException {
 +    return new InetSocketAddress( getGatewayHost(), getGatewayPort() );
 +  }
 +
 +
 +  public long getGatewayIdleTimeout() {
 +    return 0l;
 +  }
 +
 +  @Override
 +  public boolean isSSLEnabled() {
 +    return sslEnabled;
 +  }
 +
 +  public void setSSLEnabled( boolean sslEnabled ) {
 +    this.sslEnabled = sslEnabled;
 +  }
 +
 +  @Override
 +  public boolean isHadoopKerberosSecured() {
 +    return hadoopKerberosSecured;
 +  }
 +
 +  public void setHadoopKerberosSecured(boolean hadoopKerberosSecured) {
 +    this.hadoopKerberosSecured = hadoopKerberosSecured;
 +  }
-   
++
 +  @Override
 +  public String getKerberosConfig() {
 +    return kerberosConfig;
 +  }
-   
++
 +  public void setKerberosConfig(String kerberosConfig) {
 +    this.kerberosConfig = kerberosConfig;
 +  }
 +
 +  @Override
 +  public boolean isKerberosDebugEnabled() {
 +    return kerberosDebugEnabled;
 +  }
-   
++
 +  public void setKerberosDebugEnabled(boolean kerberosDebugEnabled) {
 +    this.kerberosDebugEnabled = kerberosDebugEnabled;
 +  }
-   
++
 +  @Override
 +  public String getKerberosLoginConfig() {
 +    return kerberosLoginConfig;
 +  }
 +
 +  @Override
 +  public String getDefaultTopologyName() {
 +    return defaultTopologyName;
 +  }
 +
 +  public void setDefaultTopologyName( String defaultTopologyName ) {
 +    this.defaultTopologyName = defaultTopologyName;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getDefaultAppRedirectPath()
 +   */
 +  @Override
 +  public String getDefaultAppRedirectPath() {
 +
 +    if(StringUtils.isBlank(this.defaultTopologyName)) {
 +      return "/gateway/sandbox";
 +    } else {
 +      return "/gateway/"+this.defaultTopologyName;
 +    }
 +
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getFrontendUrl()
 +   */
 +  @Override
 +  public String getFrontendUrl() { return frontendUrl; }
 +
 +  public void setFrontendUrl( String frontendUrl ) {
 +    this.frontendUrl = frontendUrl;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getExcludedSSLProtocols()
 +   */
 +  @Override
 +  public List getExcludedSSLProtocols() {
 +    List<String> protocols = new ArrayList<String>();
 +    protocols.add("SSLv3");
 +    return protocols;
 +  }
 +
 +  @Override
 +  public List getIncludedSSLCiphers() {
 +    return includedSSLCiphers;
 +  }
 +
 +  public void setIncludedSSLCiphers( List<String> list ) {
 +    includedSSLCiphers = list;
 +  }
 +
 +  @Override
 +  public List getExcludedSSLCiphers() {
 +    return excludedSSLCiphers;
 +  }
 +
 +  public void setExcludedSSLCiphers( List<String> list ) {
 +    excludedSSLCiphers = list;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#isClientAuthNeeded()
 +   */
 +  @Override
 +  public boolean isClientAuthNeeded() {
 +    // TODO Auto-generated method stub
 +    return false;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getTruststorePath()
 +   */
 +  @Override
 +  public String getTruststorePath() {
 +    // TODO Auto-generated method stub
 +    return null;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getTrustAllCerts()
 +   */
 +  @Override
 +  public boolean getTrustAllCerts() {
 +    // TODO Auto-generated method stub
 +    return false;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getTruststoreType()
 +   */
 +  @Override
 +  public String getTruststoreType() {
 +    return truststoreType;
 +  }
 +
 +  public void setTruststoreType( String truststoreType ) {
 +    this.truststoreType = truststoreType;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getKeystoreType()
 +   */
 +  @Override
 +  public String getKeystoreType() {
 +    return keystoreType;
 +  }
 +
 +  public void setKeystoreType( String keystoreType ) {
 +    this.keystoreType = keystoreType;
 +  }
 +
 +  public void setKerberosLoginConfig(String kerberosLoginConfig) {
 +   this.kerberosLoginConfig = kerberosLoginConfig;
 +  }
 +
 +   @Override
 +   public String getGatewayServicesDir() {
 +    if( gatewayServicesDir != null ) {
 +      return gatewayServicesDir;
 +    } else {
-       return getGatewayDataDir() + "/services";
++      File targetDir = new File( System.getProperty( "user.dir" ), "target/services" );
++      return targetDir.getPath();
 +    }
 +  }
 +
 +  public void setGatewayServicesDir( String gatewayServicesDir ) {
 +    this.gatewayServicesDir = gatewayServicesDir;
 +  }
 +
 +  @Override
 +  public String getGatewayApplicationsDir() {
 +    if( gatewayApplicationsDir != null ) {
 +      return gatewayApplicationsDir;
 +    } else {
 +      return getGatewayConfDir() + "/applications";
 +    }
 +  }
 +
 +  public void setGatewayApplicationsDir( String gatewayApplicationsDir ) {
 +    this.gatewayApplicationsDir = gatewayApplicationsDir;
 +   }
 +
 +  @Override
 +  public boolean isXForwardedEnabled() {
 +    return xForwardedEnabled;
 +  }
 +
 +  public void setXForwardedEnabled(boolean enabled) {
 +    xForwardedEnabled = enabled;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getEphemeralDHKeySize()
 +   */
 +  @Override
 +  public String getEphemeralDHKeySize() {
 +    return "2048";
 +  }
 +
 +  @Override
 +  public int getHttpClientMaxConnections() {
 +    return 16;
 +  }
 +
 +  @Override
 +  public int getHttpClientConnectionTimeout() {
 +    return -1;
 +  }
 +
 +  @Override
 +  public int getHttpClientSocketTimeout() {
 +    return -1;
 +  }
 +
 +  @Override
 +  public int getThreadPoolMax() {
 +    return 16;
 +  }
 +
 +  @Override
 +  public int getHttpServerRequestBuffer() {
 +    return 16*1024;
 +  }
 +
 +  @Override
 +  public int getHttpServerRequestHeaderBuffer() {
 +    return 8*1024;
 +  }
 +
 +  @Override
 +  public int getHttpServerResponseBuffer() {
 +    return 32*1024;
 +  }
 +
 +  @Override
 +  public int getHttpServerResponseHeaderBuffer() {
 +    return 8*1024;
 +  }
 +
 +  public void setGatewayDeploymentsBackupVersionLimit( int newBackupVersionLimit ) {
 +    backupVersionLimit = newBackupVersionLimit;
 +  }
 +
 +  public int getGatewayDeploymentsBackupVersionLimit() {
 +    return backupVersionLimit;
 +  }
 +
 +  public void setTopologyPortMapping(ConcurrentHashMap<String, Integer> topologyPortMapping) {
 +    this.topologyPortMapping = topologyPortMapping;
 +  }
 +
 +  public void setGatewayPortMappingEnabled(
 +      boolean topologyPortMappingEnabled) {
 +    isTopologyPortMappingEnabled = topologyPortMappingEnabled;
 +  }
 +
 +  @Override
 +  public long getGatewayDeploymentsBackupAgeLimit() {
 +    return backupAgeLimit;
 +  }
 +
 +  public void setGatewayDeploymentsBackupAgeLimit( long newBackupAgeLimit ) {
 +    backupAgeLimit = newBackupAgeLimit;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getSigningKeystoreName()
 +   */
 +  @Override
 +  public String getSigningKeystoreName() {
 +    return null;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getSigningKeyAlias()
 +   */
 +  @Override
 +  public String getSigningKeyAlias() {
 +    return null;
 +  }
 +
 +  @Override
 +  public List<String> getGlobalRulesServices() {
 +    ArrayList<String> services = new ArrayList<>();
 +    services.add("WEBHDFS");
 +    services.add("HBASE");
 +    services.add("HIVE");
 +    services.add("OOZIE");
 +    services.add("RESOURCEMANAGER");
 +    services.add("STORM");
 +    return services;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#isWebsocketEnabled()
 +   */
 +  @Override
 +  public boolean isWebsocketEnabled() {
 +    return DEFAULT_WEBSOCKET_FEATURE_ENABLED;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getWebsocketMaxTextMessageSize()
 +   */
 +  @Override
 +  public int getWebsocketMaxTextMessageSize() {
 +    return DEFAULT_WEBSOCKET_MAX_TEXT_MESSAGE_SIZE;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getWebsocketMaxBinaryMessageSize()
 +   */
 +  @Override
 +  public int getWebsocketMaxBinaryMessageSize() {
 +    return DEFAULT_WEBSOCKET_MAX_BINARY_MESSAGE_SIZE;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getWebsocketMaxTextMessageBufferSize()
 +   */
 +  @Override
 +  public int getWebsocketMaxTextMessageBufferSize() {
 +    return DEFAULT_WEBSOCKET_MAX_TEXT_MESSAGE_BUFFER_SIZE;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getWebsocketMaxBinaryMessageBufferSize()
 +   */
 +  @Override
 +  public int getWebsocketMaxBinaryMessageBufferSize() {
 +    return DEFAULT_WEBSOCKET_MAX_BINARY_MESSAGE_BUFFER_SIZE;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getWebsocketInputBufferSize()
 +   */
 +  @Override
 +  public int getWebsocketInputBufferSize() {
 +    return DEFAULT_WEBSOCKET_INPUT_BUFFER_SIZE;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getWebsocketAsyncWriteTimeout()
 +   */
 +  @Override
 +  public int getWebsocketAsyncWriteTimeout() {
 +    return DEFAULT_WEBSOCKET_ASYNC_WRITE_TIMEOUT;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getWebsocketIdleTimeout()
 +   */
 +  @Override
 +  public int getWebsocketIdleTimeout() {
 +    return DEFAULT_WEBSOCKET_IDLE_TIMEOUT;
 +  }
 +
 +  @Override
 +  public boolean isMetricsEnabled() {
 +    return false;
 +  }
 +
 +  @Override
 +  public boolean isJmxMetricsReportingEnabled() {
 +    return false;
 +  }
 +
 +  @Override
 +  public boolean isGraphiteMetricsReportingEnabled() {
 +    return false;
 +  }
 +
 +  @Override
 +  public String getGraphiteHost() {
 +    return null;
 +  }
 +
 +  @Override
 +  public int getGraphitePort() {
 +    return 0;
 +  }
 +
 +  @Override
 +  public int getGraphiteReportingFrequency() {
 +    return 0;
 +  }
 +
 +  /* (non-Javadoc)
 +   * @see GatewayConfig#getMimeTypesToCompress()
 +   */
 +  @Override
 +  public List<String> getMimeTypesToCompress() {
 +    return new ArrayList<String>();
 +  }
 +
 +  @Override
 +  public  boolean isCookieScopingToPathEnabled() {
 +    return false;
 +  }
 +
 +  @Override
 +  public String getHeaderNameForRemoteAddress() {
 +    return "X-Forwarded-For";
 +  }
 +
 +  @Override
 +  public String getAlgorithm() {
 +    return null;
 +  }
 +
 +  @Override
 +  public String getPBEAlgorithm() {
 +    return null;
 +  }
 +
 +  @Override
 +  public String getTransformation() {
 +    return null;
 +  }
 +
 +  @Override
 +  public String getSaltSize() {
 +    return null;
 +  }
 +
 +  @Override
 +  public String getIterationCount() {
 +    return null;
 +  }
 +
 +  @Override
 +  public String getKeyLength() {
 +    return null;
 +  }
 +
 +  /**
 +   * Map of Topology names and their ports.
 +   *
 +   * @return
 +   */
 +  @Override
 +  public Map<String, Integer> getGatewayPortMappings() {
 +    return topologyPortMapping;
 +  }
 +
 +  /**
 +   * Is the Port Mapping feature on ?
 +   *
 +   * @return
 +   */
 +  @Override
 +  public boolean isGatewayPortMappingEnabled() {
 +    return isTopologyPortMappingEnabled;
 +  }
 +
 +  @Override
 +  public boolean isGatewayServerHeaderEnabled() {
 +	return false;
 +  }
 +}