HADOOP-10075. Update jetty dependency to version 9 (rkanter)
This commit is contained in:
parent
9e03ee5279
commit
5877f20f9c
@ -41,7 +41,7 @@
|
|||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>commons-logging</groupId>
|
<groupId>commons-logging</groupId>
|
||||||
@ -49,18 +49,18 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>jetty</groupId>
|
<groupId>jetty</groupId>
|
||||||
<artifactId>org.mortbay.jetty</artifactId>
|
<artifactId>org.eclipse.jetty</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>servlet-api-2.5</artifactId>
|
<artifactId>servlet-api-2.5</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
@ -112,8 +112,8 @@
|
|||||||
<artifactId>avro</artifactId>
|
<artifactId>avro</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>com.sun.jersey</groupId>
|
<groupId>com.sun.jersey</groupId>
|
||||||
@ -125,7 +125,7 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
@ -137,7 +137,7 @@
|
|||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.apache.hadoop</groupId>
|
<groupId>org.apache.hadoop</groupId>
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -139,7 +139,19 @@ public void setStatus(int sc) {
|
|||||||
status = sc;
|
status = sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls setStatus(int sc, String msg) on the wrapped
|
||||||
|
* {@link HttpServletResponseWrapper} object.
|
||||||
|
*
|
||||||
|
* @param sc the status code
|
||||||
|
* @param msg the status message
|
||||||
|
* @deprecated {@link HttpServletResponseWrapper#setStatus(int, String)} is
|
||||||
|
* deprecated. To set a status code use {@link #setStatus(int)}, to send an
|
||||||
|
* error with a description use {@link #sendError(int, String)}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void setStatus(int sc, String msg) {
|
public void setStatus(int sc, String msg) {
|
||||||
super.setStatus(sc, msg);
|
super.setStatus(sc, msg);
|
||||||
status = sc;
|
status = sc;
|
||||||
|
@ -53,13 +53,18 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-servlet</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -74,7 +79,7 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -30,11 +30,14 @@
|
|||||||
import org.apache.http.impl.client.BasicCredentialsProvider;
|
import org.apache.http.impl.client.BasicCredentialsProvider;
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
import org.apache.http.util.EntityUtils;
|
import org.apache.http.util.EntityUtils;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Connector;
|
||||||
import org.mortbay.jetty.servlet.Context;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.servlet.FilterHolder;
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
import org.mortbay.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.FilterHolder;
|
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
|
|
||||||
|
import javax.servlet.DispatcherType;
|
||||||
import javax.servlet.FilterConfig;
|
import javax.servlet.FilterConfig;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
@ -53,6 +56,7 @@
|
|||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
|
import java.util.EnumSet;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
@ -63,7 +67,7 @@ public class AuthenticatorTestCase {
|
|||||||
private int port = -1;
|
private int port = -1;
|
||||||
private boolean useTomcat = false;
|
private boolean useTomcat = false;
|
||||||
private Tomcat tomcat = null;
|
private Tomcat tomcat = null;
|
||||||
Context context;
|
ServletContextHandler context;
|
||||||
|
|
||||||
private static Properties authenticatorConfig;
|
private static Properties authenticatorConfig;
|
||||||
|
|
||||||
@ -121,16 +125,19 @@ protected void start() throws Exception {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void startJetty() throws Exception {
|
protected void startJetty() throws Exception {
|
||||||
server = new Server(0);
|
server = new Server();
|
||||||
context = new Context();
|
context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
server.setHandler(context);
|
server.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(TestFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(TestFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(TestServlet.class), "/bar");
|
context.addServlet(new ServletHolder(TestServlet.class), "/bar");
|
||||||
host = "localhost";
|
host = "localhost";
|
||||||
port = getLocalPort();
|
port = getLocalPort();
|
||||||
server.getConnectors()[0].setHost(host);
|
ServerConnector connector = new ServerConnector(server);
|
||||||
server.getConnectors()[0].setPort(port);
|
connector.setHost(host);
|
||||||
|
connector.setPort(port);
|
||||||
|
server.setConnectors(new Connector[] {connector});
|
||||||
server.start();
|
server.start();
|
||||||
System.out.println("Running embedded servlet container at: http://" + host + ":" + port);
|
System.out.println("Running embedded servlet container at: http://" + host + ":" + port);
|
||||||
}
|
}
|
||||||
|
@ -93,24 +93,34 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-sslengine</artifactId>
|
<artifactId>jetty-servlet</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-webapp</artifactId>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-util-ajax</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet.jsp</groupId>
|
<groupId>javax.servlet.jsp</groupId>
|
||||||
<artifactId>jsp-api</artifactId>
|
<artifactId>jsp-api</artifactId>
|
||||||
@ -412,6 +422,18 @@
|
|||||||
<output>${project.build.directory}/generated-test-sources/java</output>
|
<output>${project.build.directory}/generated-test-sources/java</output>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>resource-gz</id>
|
||||||
|
<phase>generate-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>resource-gz</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<inputDirectory>${basedir}/src/main/webapps/static</inputDirectory>
|
||||||
|
<outputDirectory>${basedir}/target/webapps/static</outputDirectory>
|
||||||
|
<extensions>js,css</extensions>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.mortbay.jetty.servlet.DefaultServlet;
|
import org.eclipse.jetty.servlet.DefaultServlet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* General servlet which is admin-authorized.
|
* General servlet which is admin-authorized.
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.log4j.Appender;
|
import org.apache.log4j.Appender;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.mortbay.jetty.NCSARequestLog;
|
import org.eclipse.jetty.server.NCSARequestLog;
|
||||||
import org.mortbay.jetty.RequestLog;
|
import org.eclipse.jetty.server.RequestLog;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RequestLog object for use with Http
|
* RequestLog object for use with Http
|
||||||
|
@ -56,7 +56,6 @@
|
|||||||
import org.apache.hadoop.fs.CommonConfigurationKeys;
|
import org.apache.hadoop.fs.CommonConfigurationKeys;
|
||||||
import org.apache.hadoop.security.AuthenticationFilterInitializer;
|
import org.apache.hadoop.security.AuthenticationFilterInitializer;
|
||||||
import org.apache.hadoop.security.authentication.util.SignerSecretProvider;
|
import org.apache.hadoop.security.authentication.util.SignerSecretProvider;
|
||||||
import org.apache.hadoop.security.ssl.SslSelectChannelConnectorSecure;
|
|
||||||
import org.apache.hadoop.jmx.JMXJsonServlet;
|
import org.apache.hadoop.jmx.JMXJsonServlet;
|
||||||
import org.apache.hadoop.log.LogLevel;
|
import org.apache.hadoop.log.LogLevel;
|
||||||
import org.apache.hadoop.security.SecurityUtil;
|
import org.apache.hadoop.security.SecurityUtil;
|
||||||
@ -65,34 +64,39 @@
|
|||||||
import org.apache.hadoop.security.authorize.AccessControlList;
|
import org.apache.hadoop.security.authorize.AccessControlList;
|
||||||
import org.apache.hadoop.util.ReflectionUtils;
|
import org.apache.hadoop.util.ReflectionUtils;
|
||||||
import org.apache.hadoop.util.Shell;
|
import org.apache.hadoop.util.Shell;
|
||||||
import org.mortbay.io.Buffer;
|
import org.eclipse.jetty.http.HttpVersion;
|
||||||
import org.mortbay.jetty.Connector;
|
import org.eclipse.jetty.server.ConnectionFactory;
|
||||||
import org.mortbay.jetty.Handler;
|
import org.eclipse.jetty.server.Connector;
|
||||||
import org.mortbay.jetty.MimeTypes;
|
import org.eclipse.jetty.server.Handler;
|
||||||
import org.mortbay.jetty.RequestLog;
|
import org.eclipse.jetty.server.HttpConfiguration;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.HttpConnectionFactory;
|
||||||
import org.mortbay.jetty.SessionManager;
|
import org.eclipse.jetty.server.RequestLog;
|
||||||
import org.mortbay.jetty.handler.ContextHandler;
|
import org.eclipse.jetty.server.SecureRequestCustomizer;
|
||||||
import org.mortbay.jetty.handler.ContextHandlerCollection;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.handler.HandlerCollection;
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
import org.mortbay.jetty.handler.RequestLogHandler;
|
import org.eclipse.jetty.server.SessionManager;
|
||||||
import org.mortbay.jetty.nio.SelectChannelConnector;
|
import org.eclipse.jetty.server.SslConnectionFactory;
|
||||||
import org.mortbay.jetty.security.SslSelectChannelConnector;
|
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
|
||||||
import org.mortbay.jetty.servlet.AbstractSessionManager;
|
import org.eclipse.jetty.server.handler.HandlerCollection;
|
||||||
import org.mortbay.jetty.servlet.Context;
|
import org.eclipse.jetty.server.handler.RequestLogHandler;
|
||||||
import org.mortbay.jetty.servlet.DefaultServlet;
|
import org.eclipse.jetty.server.session.AbstractSessionManager;
|
||||||
import org.mortbay.jetty.servlet.FilterHolder;
|
import org.eclipse.jetty.server.session.SessionHandler;
|
||||||
import org.mortbay.jetty.servlet.SessionHandler;
|
import org.eclipse.jetty.servlet.DefaultServlet;
|
||||||
import org.mortbay.jetty.servlet.FilterMapping;
|
import org.eclipse.jetty.servlet.FilterHolder;
|
||||||
import org.mortbay.jetty.servlet.ServletHandler;
|
import org.eclipse.jetty.servlet.FilterMapping;
|
||||||
import org.mortbay.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
import org.mortbay.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.servlet.ServletHandler;
|
||||||
import org.mortbay.thread.QueuedThreadPool;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.mortbay.util.MultiException;
|
import org.eclipse.jetty.servlet.ServletMapping;
|
||||||
|
import org.eclipse.jetty.util.ArrayUtil;
|
||||||
|
import org.eclipse.jetty.util.MultiException;
|
||||||
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.sun.jersey.spi.container.servlet.ServletContainer;
|
import com.sun.jersey.spi.container.servlet.ServletContainer;
|
||||||
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a Jetty embedded server to answer http requests. The primary goal is
|
* Create a Jetty embedded server to answer http requests. The primary goal is
|
||||||
@ -126,11 +130,13 @@ public final class HttpServer2 implements FilterContainer {
|
|||||||
|
|
||||||
protected final Server webServer;
|
protected final Server webServer;
|
||||||
|
|
||||||
private final List<Connector> listeners = Lists.newArrayList();
|
private final HandlerCollection handlers;
|
||||||
|
|
||||||
|
private final List<ServerConnector> listeners = Lists.newArrayList();
|
||||||
|
|
||||||
protected final WebAppContext webAppContext;
|
protected final WebAppContext webAppContext;
|
||||||
protected final boolean findPort;
|
protected final boolean findPort;
|
||||||
protected final Map<Context, Boolean> defaultContexts =
|
private final Map<ServletContextHandler, Boolean> defaultContexts =
|
||||||
new HashMap<>();
|
new HashMap<>();
|
||||||
protected final List<String> filterNames = new ArrayList<>();
|
protected final List<String> filterNames = new ArrayList<>();
|
||||||
static final String STATE_DESCRIPTION_ALIVE = " - alive";
|
static final String STATE_DESCRIPTION_ALIVE = " - alive";
|
||||||
@ -327,49 +333,59 @@ public HttpServer2 build() throws IOException {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (URI ep : endpoints) {
|
for (URI ep : endpoints) {
|
||||||
final Connector listener;
|
final ServerConnector connector;
|
||||||
String scheme = ep.getScheme();
|
String scheme = ep.getScheme();
|
||||||
if ("http".equals(scheme)) {
|
if ("http".equals(scheme)) {
|
||||||
listener = HttpServer2.createDefaultChannelConnector();
|
connector =
|
||||||
|
HttpServer2.createDefaultChannelConnector(server.webServer);
|
||||||
} else if ("https".equals(scheme)) {
|
} else if ("https".equals(scheme)) {
|
||||||
listener = createHttpsChannelConnector();
|
connector = createHttpsChannelConnector(server.webServer);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw new HadoopIllegalArgumentException(
|
throw new HadoopIllegalArgumentException(
|
||||||
"unknown scheme for endpoint:" + ep);
|
"unknown scheme for endpoint:" + ep);
|
||||||
}
|
}
|
||||||
listener.setHost(ep.getHost());
|
connector.setHost(ep.getHost());
|
||||||
listener.setPort(ep.getPort() == -1 ? 0 : ep.getPort());
|
connector.setPort(ep.getPort() == -1 ? 0 : ep.getPort());
|
||||||
server.addListener(listener);
|
server.addListener(connector);
|
||||||
}
|
}
|
||||||
server.loadListeners();
|
server.loadListeners();
|
||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Connector createHttpsChannelConnector() {
|
private ServerConnector createHttpsChannelConnector(Server server) {
|
||||||
SslSelectChannelConnector c = new SslSelectChannelConnectorSecure();
|
ServerConnector conn = new ServerConnector(server);
|
||||||
configureChannelConnector(c);
|
HttpConfiguration httpConfig = new HttpConfiguration();
|
||||||
|
httpConfig.setRequestHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
c.setNeedClientAuth(needsClientAuth);
|
httpConfig.setResponseHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
c.setKeyPassword(keyPassword);
|
httpConfig.setSecureScheme("https");
|
||||||
|
httpConfig.addCustomizer(new SecureRequestCustomizer());
|
||||||
|
ConnectionFactory connFactory = new HttpConnectionFactory(httpConfig);
|
||||||
|
conn.addConnectionFactory(connFactory);
|
||||||
|
configureChannelConnector(conn);
|
||||||
|
|
||||||
|
SslContextFactory sslContextFactory = new SslContextFactory();
|
||||||
|
sslContextFactory.setNeedClientAuth(needsClientAuth);
|
||||||
|
sslContextFactory.setKeyManagerPassword(keyPassword);
|
||||||
if (keyStore != null) {
|
if (keyStore != null) {
|
||||||
c.setKeystore(keyStore);
|
sslContextFactory.setKeyStorePath(keyStore);
|
||||||
c.setKeystoreType(keyStoreType);
|
sslContextFactory.setKeyStoreType(keyStoreType);
|
||||||
c.setPassword(keyStorePassword);
|
sslContextFactory.setKeyStorePassword(keyStorePassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trustStore != null) {
|
if (trustStore != null) {
|
||||||
c.setTruststore(trustStore);
|
sslContextFactory.setTrustStorePath(trustStore);
|
||||||
c.setTruststoreType(trustStoreType);
|
sslContextFactory.setTrustStoreType(trustStoreType);
|
||||||
c.setTrustPassword(trustStorePassword);
|
sslContextFactory.setTrustStorePassword(trustStorePassword);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(null != excludeCiphers && !excludeCiphers.isEmpty()) {
|
if(null != excludeCiphers && !excludeCiphers.isEmpty()) {
|
||||||
c.setExcludeCipherSuites(excludeCiphers.split(","));
|
sslContextFactory.setExcludeCipherSuites(excludeCiphers.split(","));
|
||||||
LOG.info("Excluded Cipher List:" + excludeCiphers);
|
LOG.info("Excluded Cipher List:" + excludeCiphers);
|
||||||
}
|
}
|
||||||
return c;
|
|
||||||
|
conn.addFirstConnectionFactory(new SslConnectionFactory(sslContextFactory,
|
||||||
|
HttpVersion.HTTP_1_1.asString()));
|
||||||
|
|
||||||
|
return conn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -377,6 +393,7 @@ private HttpServer2(final Builder b) throws IOException {
|
|||||||
final String appDir = getWebAppsPath(b.name);
|
final String appDir = getWebAppsPath(b.name);
|
||||||
this.webServer = new Server();
|
this.webServer = new Server();
|
||||||
this.adminsAcl = b.adminsAcl;
|
this.adminsAcl = b.adminsAcl;
|
||||||
|
this.handlers = new HandlerCollection();
|
||||||
this.webAppContext = createWebAppContext(b.name, b.conf, adminsAcl, appDir);
|
this.webAppContext = createWebAppContext(b.name, b.conf, adminsAcl, appDir);
|
||||||
this.xFrameOptionIsEnabled = b.xFrameEnabled;
|
this.xFrameOptionIsEnabled = b.xFrameEnabled;
|
||||||
this.xFrameOption = b.xFrameOption;
|
this.xFrameOption = b.xFrameOption;
|
||||||
@ -406,36 +423,33 @@ private void initializeWebServer(String name, String hostName,
|
|||||||
int maxThreads = conf.getInt(HTTP_MAX_THREADS, -1);
|
int maxThreads = conf.getInt(HTTP_MAX_THREADS, -1);
|
||||||
// If HTTP_MAX_THREADS is not configured, QueueThreadPool() will use the
|
// If HTTP_MAX_THREADS is not configured, QueueThreadPool() will use the
|
||||||
// default value (currently 250).
|
// default value (currently 250).
|
||||||
QueuedThreadPool threadPool = maxThreads == -1 ? new QueuedThreadPool()
|
|
||||||
: new QueuedThreadPool(maxThreads);
|
QueuedThreadPool threadPool = (QueuedThreadPool) webServer.getThreadPool();
|
||||||
threadPool.setDaemon(true);
|
threadPool.setDaemon(true);
|
||||||
webServer.setThreadPool(threadPool);
|
if (maxThreads != -1) {
|
||||||
|
threadPool.setMaxThreads(maxThreads);
|
||||||
|
}
|
||||||
|
|
||||||
SessionManager sm = webAppContext.getSessionHandler().getSessionManager();
|
SessionManager sm = webAppContext.getSessionHandler().getSessionManager();
|
||||||
if (sm instanceof AbstractSessionManager) {
|
if (sm instanceof AbstractSessionManager) {
|
||||||
AbstractSessionManager asm = (AbstractSessionManager)sm;
|
AbstractSessionManager asm = (AbstractSessionManager)sm;
|
||||||
asm.setHttpOnly(true);
|
asm.setHttpOnly(true);
|
||||||
asm.setSecureCookies(true);
|
asm.getSessionCookieConfig().setSecure(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
ContextHandlerCollection contexts = new ContextHandlerCollection();
|
ContextHandlerCollection contexts = new ContextHandlerCollection();
|
||||||
RequestLog requestLog = HttpRequestLog.getRequestLog(name);
|
RequestLog requestLog = HttpRequestLog.getRequestLog(name);
|
||||||
|
|
||||||
|
handlers.addHandler(contexts);
|
||||||
if (requestLog != null) {
|
if (requestLog != null) {
|
||||||
RequestLogHandler requestLogHandler = new RequestLogHandler();
|
RequestLogHandler requestLogHandler = new RequestLogHandler();
|
||||||
requestLogHandler.setRequestLog(requestLog);
|
requestLogHandler.setRequestLog(requestLog);
|
||||||
HandlerCollection handlers = new HandlerCollection();
|
handlers.addHandler(requestLogHandler);
|
||||||
handlers.setHandlers(new Handler[] {contexts, requestLogHandler});
|
|
||||||
webServer.setHandler(handlers);
|
|
||||||
} else {
|
|
||||||
webServer.setHandler(contexts);
|
|
||||||
}
|
}
|
||||||
|
handlers.addHandler(webAppContext);
|
||||||
final String appDir = getWebAppsPath(name);
|
final String appDir = getWebAppsPath(name);
|
||||||
|
|
||||||
webServer.addHandler(webAppContext);
|
|
||||||
|
|
||||||
addDefaultApps(contexts, appDir, conf);
|
addDefaultApps(contexts, appDir, conf);
|
||||||
|
webServer.setHandler(handlers);
|
||||||
|
|
||||||
Map<String, String> xFrameParams = new HashMap<>();
|
Map<String, String> xFrameParams = new HashMap<>();
|
||||||
xFrameParams.put(X_FRAME_ENABLED,
|
xFrameParams.put(X_FRAME_ENABLED,
|
||||||
@ -461,7 +475,7 @@ private void initializeWebServer(String name, String hostName,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addListener(Connector connector) {
|
private void addListener(ServerConnector connector) {
|
||||||
listeners.add(connector);
|
listeners.add(connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,16 +521,14 @@ private static Properties getFilterProperties(Configuration conf, String
|
|||||||
return prop;
|
return prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addNoCacheFilter(WebAppContext ctxt) {
|
private static void addNoCacheFilter(ServletContextHandler ctxt) {
|
||||||
defineFilter(ctxt, NO_CACHE_FILTER, NoCacheFilter.class.getName(),
|
defineFilter(ctxt, NO_CACHE_FILTER, NoCacheFilter.class.getName(),
|
||||||
Collections.<String, String> emptyMap(), new String[] { "/*" });
|
Collections.<String, String> emptyMap(), new String[] { "/*" });
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void configureChannelConnector(SelectChannelConnector c) {
|
private static void configureChannelConnector(ServerConnector c) {
|
||||||
c.setLowResourceMaxIdleTime(10000);
|
c.setIdleTimeout(10000);
|
||||||
c.setAcceptQueueSize(128);
|
c.setAcceptQueueSize(128);
|
||||||
c.setResolveNames(false);
|
|
||||||
c.setUseDirectBuffers(false);
|
|
||||||
if(Shell.WINDOWS) {
|
if(Shell.WINDOWS) {
|
||||||
// result of setting the SO_REUSEADDR flag is different on Windows
|
// result of setting the SO_REUSEADDR flag is different on Windows
|
||||||
// http://msdn.microsoft.com/en-us/library/ms740621(v=vs.85).aspx
|
// http://msdn.microsoft.com/en-us/library/ms740621(v=vs.85).aspx
|
||||||
@ -524,14 +536,18 @@ private static void configureChannelConnector(SelectChannelConnector c) {
|
|||||||
// the same port with indeterminate routing of incoming requests to them
|
// the same port with indeterminate routing of incoming requests to them
|
||||||
c.setReuseAddress(false);
|
c.setReuseAddress(false);
|
||||||
}
|
}
|
||||||
c.setHeaderBufferSize(1024*64);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
public static Connector createDefaultChannelConnector() {
|
public static ServerConnector createDefaultChannelConnector(Server server) {
|
||||||
SelectChannelConnector ret = new SelectChannelConnector();
|
ServerConnector conn = new ServerConnector(server);
|
||||||
configureChannelConnector(ret);
|
HttpConfiguration httpConfig = new HttpConfiguration();
|
||||||
return ret;
|
httpConfig.setRequestHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
|
httpConfig.setResponseHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
|
ConnectionFactory connFactory = new HttpConnectionFactory(httpConfig);
|
||||||
|
conn.addConnectionFactory(connFactory);
|
||||||
|
configureChannelConnector(conn);
|
||||||
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get an array of FilterConfiguration specified in the conf */
|
/** Get an array of FilterConfiguration specified in the conf */
|
||||||
@ -567,7 +583,8 @@ protected void addDefaultApps(ContextHandlerCollection parent,
|
|||||||
CommonConfigurationKeys.HADOOP_HTTP_LOGS_ENABLED,
|
CommonConfigurationKeys.HADOOP_HTTP_LOGS_ENABLED,
|
||||||
CommonConfigurationKeys.HADOOP_HTTP_LOGS_ENABLED_DEFAULT);
|
CommonConfigurationKeys.HADOOP_HTTP_LOGS_ENABLED_DEFAULT);
|
||||||
if (logDir != null && logsEnabled) {
|
if (logDir != null && logsEnabled) {
|
||||||
Context logContext = new Context(parent, "/logs");
|
ServletContextHandler logContext =
|
||||||
|
new ServletContextHandler(parent, "/logs");
|
||||||
logContext.setResourceBase(logDir);
|
logContext.setResourceBase(logDir);
|
||||||
logContext.addServlet(AdminAuthorizedServlet.class, "/*");
|
logContext.addServlet(AdminAuthorizedServlet.class, "/*");
|
||||||
if (conf.getBoolean(
|
if (conf.getBoolean(
|
||||||
@ -575,8 +592,7 @@ protected void addDefaultApps(ContextHandlerCollection parent,
|
|||||||
CommonConfigurationKeys.DEFAULT_HADOOP_JETTY_LOGS_SERVE_ALIASES)) {
|
CommonConfigurationKeys.DEFAULT_HADOOP_JETTY_LOGS_SERVE_ALIASES)) {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
Map<String, String> params = logContext.getInitParams();
|
Map<String, String> params = logContext.getInitParams();
|
||||||
params.put(
|
params.put("org.eclipse.jetty.servlet.Default.aliases", "true");
|
||||||
"org.mortbay.jetty.servlet.Default.aliases", "true");
|
|
||||||
}
|
}
|
||||||
logContext.setDisplayName("logs");
|
logContext.setDisplayName("logs");
|
||||||
SessionHandler handler = new SessionHandler();
|
SessionHandler handler = new SessionHandler();
|
||||||
@ -584,34 +600,37 @@ protected void addDefaultApps(ContextHandlerCollection parent,
|
|||||||
if (sm instanceof AbstractSessionManager) {
|
if (sm instanceof AbstractSessionManager) {
|
||||||
AbstractSessionManager asm = (AbstractSessionManager) sm;
|
AbstractSessionManager asm = (AbstractSessionManager) sm;
|
||||||
asm.setHttpOnly(true);
|
asm.setHttpOnly(true);
|
||||||
asm.setSecureCookies(true);
|
asm.getSessionCookieConfig().setSecure(true);
|
||||||
}
|
}
|
||||||
logContext.setSessionHandler(handler);
|
logContext.setSessionHandler(handler);
|
||||||
setContextAttributes(logContext, conf);
|
setContextAttributes(logContext, conf);
|
||||||
addNoCacheFilter(webAppContext);
|
addNoCacheFilter(logContext);
|
||||||
defaultContexts.put(logContext, true);
|
defaultContexts.put(logContext, true);
|
||||||
}
|
}
|
||||||
// set up the context for "/static/*"
|
// set up the context for "/static/*"
|
||||||
Context staticContext = new Context(parent, "/static");
|
ServletContextHandler staticContext =
|
||||||
|
new ServletContextHandler(parent, "/static");
|
||||||
staticContext.setResourceBase(appDir + "/static");
|
staticContext.setResourceBase(appDir + "/static");
|
||||||
staticContext.addServlet(DefaultServlet.class, "/*");
|
staticContext.addServlet(DefaultServlet.class, "/*");
|
||||||
staticContext.setDisplayName("static");
|
staticContext.setDisplayName("static");
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
Map<String, String> params = staticContext.getInitParams();
|
Map<String, String> params = staticContext.getInitParams();
|
||||||
params.put("org.mortbay.jetty.servlet.Default.dirAllowed", "false");
|
params.put("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
|
||||||
|
params.put("org.eclipse.jetty.servlet.Default.gzip", "true");
|
||||||
SessionHandler handler = new SessionHandler();
|
SessionHandler handler = new SessionHandler();
|
||||||
SessionManager sm = handler.getSessionManager();
|
SessionManager sm = handler.getSessionManager();
|
||||||
if (sm instanceof AbstractSessionManager) {
|
if (sm instanceof AbstractSessionManager) {
|
||||||
AbstractSessionManager asm = (AbstractSessionManager) sm;
|
AbstractSessionManager asm = (AbstractSessionManager) sm;
|
||||||
asm.setHttpOnly(true);
|
asm.setHttpOnly(true);
|
||||||
asm.setSecureCookies(true);
|
asm.getSessionCookieConfig().setSecure(true);
|
||||||
}
|
}
|
||||||
staticContext.setSessionHandler(handler);
|
staticContext.setSessionHandler(handler);
|
||||||
setContextAttributes(staticContext, conf);
|
setContextAttributes(staticContext, conf);
|
||||||
defaultContexts.put(staticContext, true);
|
defaultContexts.put(staticContext, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setContextAttributes(Context context, Configuration conf) {
|
private void setContextAttributes(ServletContextHandler context,
|
||||||
|
Configuration conf) {
|
||||||
context.getServletContext().setAttribute(CONF_CONTEXT_ATTRIBUTE, conf);
|
context.getServletContext().setAttribute(CONF_CONTEXT_ATTRIBUTE, conf);
|
||||||
context.getServletContext().setAttribute(ADMINS_ACL, adminsAcl);
|
context.getServletContext().setAttribute(ADMINS_ACL, adminsAcl);
|
||||||
}
|
}
|
||||||
@ -627,9 +646,9 @@ protected void addDefaultServlets() {
|
|||||||
addServlet("conf", "/conf", ConfServlet.class);
|
addServlet("conf", "/conf", ConfServlet.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addContext(Context ctxt, boolean isFiltered) {
|
public void addContext(ServletContextHandler ctxt, boolean isFiltered) {
|
||||||
webServer.addHandler(ctxt);
|
handlers.addHandler(ctxt);
|
||||||
addNoCacheFilter(webAppContext);
|
addNoCacheFilter(ctxt);
|
||||||
defaultContexts.put(ctxt, isFiltered);
|
defaultContexts.put(ctxt, isFiltered);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -691,7 +710,7 @@ public void addInternalServlet(String name, String pathSpec,
|
|||||||
* protect with Kerberos authentication.
|
* protect with Kerberos authentication.
|
||||||
* Note: This method is to be used for adding servlets that facilitate
|
* Note: This method is to be used for adding servlets that facilitate
|
||||||
* internal communication and not for user facing functionality. For
|
* internal communication and not for user facing functionality. For
|
||||||
+ * servlets added using this method, filters (except internal Kerberos
|
* servlets added using this method, filters (except internal Kerberos
|
||||||
* filters) are not enabled.
|
* filters) are not enabled.
|
||||||
*
|
*
|
||||||
* @param name The name of the servlet (can be passed as null)
|
* @param name The name of the servlet (can be passed as null)
|
||||||
@ -705,6 +724,25 @@ public void addInternalServlet(String name, String pathSpec,
|
|||||||
if (name != null) {
|
if (name != null) {
|
||||||
holder.setName(name);
|
holder.setName(name);
|
||||||
}
|
}
|
||||||
|
// Jetty doesn't like the same path spec mapping to different servlets, so
|
||||||
|
// if there's already a mapping for this pathSpec, remove it and assume that
|
||||||
|
// the newest one is the one we want
|
||||||
|
final ServletMapping[] servletMappings =
|
||||||
|
webAppContext.getServletHandler().getServletMappings();
|
||||||
|
for (int i = 0; i < servletMappings.length; i++) {
|
||||||
|
if (servletMappings[i].containsPathSpec(pathSpec)) {
|
||||||
|
if (LOG.isDebugEnabled()) {
|
||||||
|
LOG.debug("Found existing " + servletMappings[i].getServletName() +
|
||||||
|
" servlet at path " + pathSpec + "; will replace mapping" +
|
||||||
|
" with " + holder.getName() + " servlet");
|
||||||
|
}
|
||||||
|
ServletMapping[] newServletMappings =
|
||||||
|
ArrayUtil.removeFromArray(servletMappings, servletMappings[i]);
|
||||||
|
webAppContext.getServletHandler()
|
||||||
|
.setServletMappings(newServletMappings);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
webAppContext.addServlet(holder, pathSpec);
|
webAppContext.addServlet(holder, pathSpec);
|
||||||
|
|
||||||
if(requireAuth && UserGroupInformation.isSecurityEnabled()) {
|
if(requireAuth && UserGroupInformation.isSecurityEnabled()) {
|
||||||
@ -713,11 +751,31 @@ public void addInternalServlet(String name, String pathSpec,
|
|||||||
FilterMapping fmap = new FilterMapping();
|
FilterMapping fmap = new FilterMapping();
|
||||||
fmap.setPathSpec(pathSpec);
|
fmap.setPathSpec(pathSpec);
|
||||||
fmap.setFilterName(SPNEGO_FILTER);
|
fmap.setFilterName(SPNEGO_FILTER);
|
||||||
fmap.setDispatches(Handler.ALL);
|
fmap.setDispatches(FilterMapping.ALL);
|
||||||
handler.addFilterMapping(fmap);
|
handler.addFilterMapping(fmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the given handler to the front of the list of handlers.
|
||||||
|
*
|
||||||
|
* @param handler The handler to add
|
||||||
|
*/
|
||||||
|
public void addHandlerAtFront(Handler handler) {
|
||||||
|
Handler[] h = ArrayUtil.prependToArray(
|
||||||
|
handler, this.handlers.getHandlers(), Handler.class);
|
||||||
|
handlers.setHandlers(h);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the given handler to the end of the list of handlers.
|
||||||
|
*
|
||||||
|
* @param handler The handler to add
|
||||||
|
*/
|
||||||
|
public void addHandlerAtEnd(Handler handler) {
|
||||||
|
handlers.addHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addFilter(String name, String classname,
|
public void addFilter(String name, String classname,
|
||||||
Map<String, String> parameters) {
|
Map<String, String> parameters) {
|
||||||
@ -727,12 +785,14 @@ public void addFilter(String name, String classname,
|
|||||||
FilterMapping fmap = getFilterMapping(name, USER_FACING_URLS);
|
FilterMapping fmap = getFilterMapping(name, USER_FACING_URLS);
|
||||||
defineFilter(webAppContext, filterHolder, fmap);
|
defineFilter(webAppContext, filterHolder, fmap);
|
||||||
LOG.info(
|
LOG.info(
|
||||||
"Added filter " + name + " (class=" + classname + ") to context " + webAppContext.getDisplayName());
|
"Added filter " + name + " (class=" + classname + ") to context "
|
||||||
|
+ webAppContext.getDisplayName());
|
||||||
final String[] ALL_URLS = { "/*" };
|
final String[] ALL_URLS = { "/*" };
|
||||||
fmap = getFilterMapping(name, ALL_URLS);
|
fmap = getFilterMapping(name, ALL_URLS);
|
||||||
for (Map.Entry<Context, Boolean> e : defaultContexts.entrySet()) {
|
for (Map.Entry<ServletContextHandler, Boolean> e
|
||||||
|
: defaultContexts.entrySet()) {
|
||||||
if (e.getValue()) {
|
if (e.getValue()) {
|
||||||
Context ctx = e.getKey();
|
ServletContextHandler ctx = e.getKey();
|
||||||
defineFilter(ctx, filterHolder, fmap);
|
defineFilter(ctx, filterHolder, fmap);
|
||||||
LOG.info("Added filter " + name + " (class=" + classname
|
LOG.info("Added filter " + name + " (class=" + classname
|
||||||
+ ") to context " + ctx.getDisplayName());
|
+ ") to context " + ctx.getDisplayName());
|
||||||
@ -748,7 +808,7 @@ public void addGlobalFilter(String name, String classname,
|
|||||||
FilterHolder filterHolder = getFilterHolder(name, classname, parameters);
|
FilterHolder filterHolder = getFilterHolder(name, classname, parameters);
|
||||||
FilterMapping fmap = getFilterMapping(name, ALL_URLS);
|
FilterMapping fmap = getFilterMapping(name, ALL_URLS);
|
||||||
defineFilter(webAppContext, filterHolder, fmap);
|
defineFilter(webAppContext, filterHolder, fmap);
|
||||||
for (Context ctx : defaultContexts.keySet()) {
|
for (ServletContextHandler ctx : defaultContexts.keySet()) {
|
||||||
defineFilter(ctx, filterHolder, fmap);
|
defineFilter(ctx, filterHolder, fmap);
|
||||||
}
|
}
|
||||||
LOG.info("Added global filter '" + name + "' (class=" + classname + ")");
|
LOG.info("Added global filter '" + name + "' (class=" + classname + ")");
|
||||||
@ -757,7 +817,7 @@ public void addGlobalFilter(String name, String classname,
|
|||||||
/**
|
/**
|
||||||
* Define a filter for a context and set up default url mappings.
|
* Define a filter for a context and set up default url mappings.
|
||||||
*/
|
*/
|
||||||
public static void defineFilter(Context ctx, String name,
|
public static void defineFilter(ServletContextHandler ctx, String name,
|
||||||
String classname, Map<String,String> parameters, String[] urls) {
|
String classname, Map<String,String> parameters, String[] urls) {
|
||||||
FilterHolder filterHolder = getFilterHolder(name, classname, parameters);
|
FilterHolder filterHolder = getFilterHolder(name, classname, parameters);
|
||||||
FilterMapping fmap = getFilterMapping(name, urls);
|
FilterMapping fmap = getFilterMapping(name, urls);
|
||||||
@ -767,8 +827,8 @@ public static void defineFilter(Context ctx, String name,
|
|||||||
/**
|
/**
|
||||||
* Define a filter for a context and set up default url mappings.
|
* Define a filter for a context and set up default url mappings.
|
||||||
*/
|
*/
|
||||||
private static void defineFilter(Context ctx, FilterHolder holder,
|
private static void defineFilter(ServletContextHandler ctx,
|
||||||
FilterMapping fmap) {
|
FilterHolder holder, FilterMapping fmap) {
|
||||||
ServletHandler handler = ctx.getServletHandler();
|
ServletHandler handler = ctx.getServletHandler();
|
||||||
handler.addFilter(holder, fmap);
|
handler.addFilter(holder, fmap);
|
||||||
}
|
}
|
||||||
@ -776,7 +836,7 @@ private static void defineFilter(Context ctx, FilterHolder holder,
|
|||||||
private static FilterMapping getFilterMapping(String name, String[] urls) {
|
private static FilterMapping getFilterMapping(String name, String[] urls) {
|
||||||
FilterMapping fmap = new FilterMapping();
|
FilterMapping fmap = new FilterMapping();
|
||||||
fmap.setPathSpecs(urls);
|
fmap.setPathSpecs(urls);
|
||||||
fmap.setDispatches(Handler.ALL);
|
fmap.setDispatches(FilterMapping.ALL);
|
||||||
fmap.setFilterName(name);
|
fmap.setFilterName(name);
|
||||||
return fmap;
|
return fmap;
|
||||||
}
|
}
|
||||||
@ -786,7 +846,9 @@ private static FilterHolder getFilterHolder(String name, String classname,
|
|||||||
FilterHolder holder = new FilterHolder();
|
FilterHolder holder = new FilterHolder();
|
||||||
holder.setName(name);
|
holder.setName(name);
|
||||||
holder.setClassName(classname);
|
holder.setClassName(classname);
|
||||||
|
if (parameters != null) {
|
||||||
holder.setInitParameters(parameters);
|
holder.setInitParameters(parameters);
|
||||||
|
}
|
||||||
return holder;
|
return holder;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -796,13 +858,13 @@ private static FilterHolder getFilterHolder(String name, String classname,
|
|||||||
* @param webAppCtx The WebApplicationContext to add to
|
* @param webAppCtx The WebApplicationContext to add to
|
||||||
*/
|
*/
|
||||||
protected void addFilterPathMapping(String pathSpec,
|
protected void addFilterPathMapping(String pathSpec,
|
||||||
Context webAppCtx) {
|
ServletContextHandler webAppCtx) {
|
||||||
ServletHandler handler = webAppCtx.getServletHandler();
|
ServletHandler handler = webAppCtx.getServletHandler();
|
||||||
for(String name : filterNames) {
|
for(String name : filterNames) {
|
||||||
FilterMapping fmap = new FilterMapping();
|
FilterMapping fmap = new FilterMapping();
|
||||||
fmap.setPathSpec(pathSpec);
|
fmap.setPathSpec(pathSpec);
|
||||||
fmap.setFilterName(name);
|
fmap.setFilterName(name);
|
||||||
fmap.setDispatches(Handler.ALL);
|
fmap.setDispatches(FilterMapping.ALL);
|
||||||
handler.addFilterMapping(fmap);
|
handler.addFilterMapping(fmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -841,23 +903,23 @@ protected String getWebAppsPath(String appName) throws FileNotFoundException {
|
|||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public int getPort() {
|
public int getPort() {
|
||||||
return webServer.getConnectors()[0].getLocalPort();
|
return ((ServerConnector)webServer.getConnectors()[0]).getLocalPort();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the address that corresponds to a particular connector.
|
* Get the address that corresponds to a particular connector.
|
||||||
*
|
*
|
||||||
* @return the corresponding address for the connector, or null if there's no
|
* @return the corresponding address for the connector, or null if there's no
|
||||||
* such connector or the connector is not bounded.
|
* such connector or the connector is not bounded or was closed.
|
||||||
*/
|
*/
|
||||||
public InetSocketAddress getConnectorAddress(int index) {
|
public InetSocketAddress getConnectorAddress(int index) {
|
||||||
Preconditions.checkArgument(index >= 0);
|
Preconditions.checkArgument(index >= 0);
|
||||||
if (index > webServer.getConnectors().length)
|
if (index > webServer.getConnectors().length)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
Connector c = webServer.getConnectors()[index];
|
ServerConnector c = (ServerConnector)webServer.getConnectors()[index];
|
||||||
if (c.getLocalPort() == -1) {
|
if (c.getLocalPort() == -1 || c.getLocalPort() == -2) {
|
||||||
// The connector is not bounded
|
// The connector is not bounded or was closed
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -907,8 +969,8 @@ public void start() throws IOException {
|
|||||||
throw ex;
|
throw ex;
|
||||||
}
|
}
|
||||||
// Make sure there is no handler failures.
|
// Make sure there is no handler failures.
|
||||||
Handler[] handlers = webServer.getHandlers();
|
Handler[] hs = webServer.getHandlers();
|
||||||
for (Handler handler : handlers) {
|
for (Handler handler : hs) {
|
||||||
if (handler.isFailed()) {
|
if (handler.isFailed()) {
|
||||||
throw new IOException(
|
throw new IOException(
|
||||||
"Problem in starting http server. Server handlers failed");
|
"Problem in starting http server. Server handlers failed");
|
||||||
@ -944,9 +1006,10 @@ private void loadListeners() {
|
|||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
void openListeners() throws Exception {
|
void openListeners() throws Exception {
|
||||||
for (Connector listener : listeners) {
|
for (ServerConnector listener : listeners) {
|
||||||
if (listener.getLocalPort() != -1) {
|
if (listener.getLocalPort() != -1 && listener.getLocalPort() != -2) {
|
||||||
// This listener is either started externally or has been bound
|
// This listener is either started externally or has been bound or was
|
||||||
|
// closed
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int port = listener.getPort();
|
int port = listener.getPort();
|
||||||
@ -978,7 +1041,7 @@ void openListeners() throws Exception {
|
|||||||
*/
|
*/
|
||||||
public void stop() throws Exception {
|
public void stop() throws Exception {
|
||||||
MultiException exception = null;
|
MultiException exception = null;
|
||||||
for (Connector c : listeners) {
|
for (ServerConnector c : listeners) {
|
||||||
try {
|
try {
|
||||||
c.close();
|
c.close();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -1042,7 +1105,7 @@ public String toString() {
|
|||||||
.append(isAlive() ? STATE_DESCRIPTION_ALIVE
|
.append(isAlive() ? STATE_DESCRIPTION_ALIVE
|
||||||
: STATE_DESCRIPTION_NOT_LIVE)
|
: STATE_DESCRIPTION_NOT_LIVE)
|
||||||
.append("), listening at:");
|
.append("), listening at:");
|
||||||
for (Connector l : listeners) {
|
for (ServerConnector l : listeners) {
|
||||||
sb.append(l.getHost()).append(":").append(l.getPort()).append("/,");
|
sb.append(l.getHost()).append(":").append(l.getPort()).append("/,");
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
@ -1300,10 +1363,10 @@ public void doFilter(ServletRequest request,
|
|||||||
*/
|
*/
|
||||||
private String inferMimeType(ServletRequest request) {
|
private String inferMimeType(ServletRequest request) {
|
||||||
String path = ((HttpServletRequest)request).getRequestURI();
|
String path = ((HttpServletRequest)request).getRequestURI();
|
||||||
ContextHandler.SContext sContext = (ContextHandler.SContext)config.getServletContext();
|
ServletContextHandler.Context sContext =
|
||||||
MimeTypes mimes = sContext.getContextHandler().getMimeTypes();
|
(ServletContextHandler.Context)config.getServletContext();
|
||||||
Buffer mimeBuffer = mimes.getMimeByExtension(path);
|
String mime = sContext.getMimeType(path);
|
||||||
return (mimeBuffer == null) ? null : mimeBuffer.toString();
|
return (mime == null) ? null : mime;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* 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.hadoop.http;
|
||||||
|
|
||||||
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
|
import org.apache.hadoop.classification.InterfaceStability;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains utility methods and constants relating to Jetty.
|
||||||
|
*/
|
||||||
|
@InterfaceAudience.Public
|
||||||
|
@InterfaceStability.Evolving
|
||||||
|
public final class JettyUtils {
|
||||||
|
public static final String UTF_8 = "charset=utf-8";
|
||||||
|
public static final int HEADER_SIZE = 1024 * 64;
|
||||||
|
|
||||||
|
private JettyUtils() {
|
||||||
|
}
|
||||||
|
}
|
@ -1,58 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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.hadoop.security.ssl;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import javax.net.ssl.SSLEngine;
|
|
||||||
|
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
|
||||||
import org.mortbay.jetty.security.SslSelectChannelConnector;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This subclass of the Jetty SslSelectChannelConnector exists solely to
|
|
||||||
* control the TLS protocol versions allowed. This is fallout from the
|
|
||||||
* POODLE vulnerability (CVE-2014-3566), which requires that SSLv3 be disabled.
|
|
||||||
* Only TLS 1.0 and later protocols are allowed.
|
|
||||||
*/
|
|
||||||
@InterfaceAudience.Private
|
|
||||||
public class SslSelectChannelConnectorSecure extends SslSelectChannelConnector {
|
|
||||||
|
|
||||||
public SslSelectChannelConnectorSecure() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable SSLv3 protocol.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected SSLEngine createSSLEngine() throws IOException {
|
|
||||||
SSLEngine engine = super.createSSLEngine();
|
|
||||||
ArrayList<String> nonSSLProtocols = new ArrayList<String>();
|
|
||||||
for (String p : engine.getEnabledProtocols()) {
|
|
||||||
if (!p.contains("SSLv3")) {
|
|
||||||
nonSSLProtocols.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
engine.setEnabledProtocols(nonSSLProtocols.toArray(
|
|
||||||
new String[nonSSLProtocols.size()]));
|
|
||||||
return engine;
|
|
||||||
}
|
|
||||||
}
|
|
@ -31,7 +31,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@ -797,7 +797,7 @@ public void testRenameNonExistentPath() throws Exception {
|
|||||||
rename(src, dst, false, false, false, Rename.NONE);
|
rename(src, dst, false, false, false, Rename.NONE);
|
||||||
Assert.fail("Should throw FileNotFoundException");
|
Assert.fail("Should throw FileNotFoundException");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.info("XXX", e);
|
Log.getLog().info("XXX", e);
|
||||||
Assert.assertTrue(unwrapException(e) instanceof FileNotFoundException);
|
Assert.assertTrue(unwrapException(e) instanceof FileNotFoundException);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.viewfs.ConfigUtil;
|
import org.apache.hadoop.fs.viewfs.ConfigUtil;
|
||||||
import org.apache.hadoop.util.Shell;
|
import org.apache.hadoop.util.Shell;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,7 +84,7 @@ static public FileSystem setupForViewFileSystem(Configuration conf, FileSystemTe
|
|||||||
|
|
||||||
FileSystem fsView = FileSystem.get(FsConstants.VIEWFS_URI, conf);
|
FileSystem fsView = FileSystem.get(FsConstants.VIEWFS_URI, conf);
|
||||||
fsView.setWorkingDirectory(new Path(wdDir)); // in case testdir relative to wd.
|
fsView.setWorkingDirectory(new Path(wdDir)); // in case testdir relative to wd.
|
||||||
Log.info("Working dir is: " + fsView.getWorkingDirectory());
|
Log.getLog().info("Working dir is: " + fsView.getWorkingDirectory());
|
||||||
return fsView;
|
return fsView;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,12 +118,12 @@ static void setUpHomeDir(Configuration conf, FileSystem fsTarget) {
|
|||||||
} else { // home dir is at root. Just link the home dir itse
|
} else { // home dir is at root. Just link the home dir itse
|
||||||
URI linkTarget = fsTarget.makeQualified(new Path(homeDir)).toUri();
|
URI linkTarget = fsTarget.makeQualified(new Path(homeDir)).toUri();
|
||||||
ConfigUtil.addLink(conf, homeDir, linkTarget);
|
ConfigUtil.addLink(conf, homeDir, linkTarget);
|
||||||
Log.info("Added link for home dir " + homeDir + "->" + linkTarget);
|
Log.getLog().info("Added link for home dir " + homeDir + "->" + linkTarget);
|
||||||
}
|
}
|
||||||
// Now set the root of the home dir for viewfs
|
// Now set the root of the home dir for viewfs
|
||||||
String homeDirRoot = fsTarget.getHomeDirectory().getParent().toUri().getPath();
|
String homeDirRoot = fsTarget.getHomeDirectory().getParent().toUri().getPath();
|
||||||
ConfigUtil.setHomeDirConf(conf, homeDirRoot);
|
ConfigUtil.setHomeDirConf(conf, homeDirRoot);
|
||||||
Log.info("Home dir base for viewfs" + homeDirRoot);
|
Log.getLog().info("Home dir base for viewfs" + homeDirRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -138,7 +138,7 @@ static void linkUpFirstComponents(Configuration conf, String path, FileSystem fs
|
|||||||
String firstComponent = path.substring(0, indexOfEnd);
|
String firstComponent = path.substring(0, indexOfEnd);
|
||||||
URI linkTarget = fsTarget.makeQualified(new Path(firstComponent)).toUri();
|
URI linkTarget = fsTarget.makeQualified(new Path(firstComponent)).toUri();
|
||||||
ConfigUtil.addLink(conf, firstComponent, linkTarget);
|
ConfigUtil.addLink(conf, firstComponent, linkTarget);
|
||||||
Log.info("Added link for " + info + " "
|
Log.getLog().info("Added link for " + info + " "
|
||||||
+ firstComponent + "->" + linkTarget);
|
+ firstComponent + "->" + linkTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.viewfs.ConfigUtil;
|
import org.apache.hadoop.fs.viewfs.ConfigUtil;
|
||||||
import org.apache.hadoop.util.Shell;
|
import org.apache.hadoop.util.Shell;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,7 +82,7 @@ static public FileContext setupForViewFsLocalFs(FileContextTestHelper helper) th
|
|||||||
|
|
||||||
FileContext fc = FileContext.getFileContext(FsConstants.VIEWFS_URI, conf);
|
FileContext fc = FileContext.getFileContext(FsConstants.VIEWFS_URI, conf);
|
||||||
fc.setWorkingDirectory(new Path(wdDir)); // in case testdir relative to wd.
|
fc.setWorkingDirectory(new Path(wdDir)); // in case testdir relative to wd.
|
||||||
Log.info("Working dir is: " + fc.getWorkingDirectory());
|
Log.getLog().info("Working dir is: " + fc.getWorkingDirectory());
|
||||||
//System.out.println("SRCOfTests = "+ getTestRootPath(fc, "test"));
|
//System.out.println("SRCOfTests = "+ getTestRootPath(fc, "test"));
|
||||||
//System.out.println("TargetOfTests = "+ targetOfTests.toUri());
|
//System.out.println("TargetOfTests = "+ targetOfTests.toUri());
|
||||||
return fc;
|
return fc;
|
||||||
@ -107,12 +107,12 @@ static void setUpHomeDir(Configuration conf, FileContext fsTarget) {
|
|||||||
} else { // home dir is at root. Just link the home dir itse
|
} else { // home dir is at root. Just link the home dir itse
|
||||||
URI linkTarget = fsTarget.makeQualified(new Path(homeDir)).toUri();
|
URI linkTarget = fsTarget.makeQualified(new Path(homeDir)).toUri();
|
||||||
ConfigUtil.addLink(conf, homeDir, linkTarget);
|
ConfigUtil.addLink(conf, homeDir, linkTarget);
|
||||||
Log.info("Added link for home dir " + homeDir + "->" + linkTarget);
|
Log.getLog().info("Added link for home dir " + homeDir + "->" + linkTarget);
|
||||||
}
|
}
|
||||||
// Now set the root of the home dir for viewfs
|
// Now set the root of the home dir for viewfs
|
||||||
String homeDirRoot = fsTarget.getHomeDirectory().getParent().toUri().getPath();
|
String homeDirRoot = fsTarget.getHomeDirectory().getParent().toUri().getPath();
|
||||||
ConfigUtil.setHomeDirConf(conf, homeDirRoot);
|
ConfigUtil.setHomeDirConf(conf, homeDirRoot);
|
||||||
Log.info("Home dir base for viewfs" + homeDirRoot);
|
Log.getLog().info("Home dir base for viewfs" + homeDirRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -128,7 +128,7 @@ static void linkUpFirstComponents(Configuration conf, String path,
|
|||||||
String firstComponent = path.substring(0, indexOfEnd);
|
String firstComponent = path.substring(0, indexOfEnd);
|
||||||
URI linkTarget = fsTarget.makeQualified(new Path(firstComponent)).toUri();
|
URI linkTarget = fsTarget.makeQualified(new Path(firstComponent)).toUri();
|
||||||
ConfigUtil.addLink(conf, firstComponent, linkTarget);
|
ConfigUtil.addLink(conf, firstComponent, linkTarget);
|
||||||
Log.info("Added link for " + info + " "
|
Log.getLog().info("Added link for " + info + " "
|
||||||
+ firstComponent + "->" + linkTarget);
|
+ firstComponent + "->" + linkTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
import org.apache.hadoop.test.GenericTestUtils;
|
import org.apache.hadoop.test.GenericTestUtils;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
import javax.servlet.*;
|
import javax.servlet.*;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
@ -33,6 +33,7 @@
|
|||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.HttpCookie;
|
import java.net.HttpCookie;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TestAuthenticationSessionCookie {
|
public class TestAuthenticationSessionCookie {
|
||||||
@ -71,7 +72,7 @@ public static class DummyFilterInitializer extends FilterInitializer {
|
|||||||
@Override
|
@Override
|
||||||
public void initFilter(FilterContainer container, Configuration conf) {
|
public void initFilter(FilterContainer container, Configuration conf) {
|
||||||
container.addFilter("DummyAuth", DummyAuthenticationFilter.class
|
container.addFilter("DummyAuth", DummyAuthenticationFilter.class
|
||||||
.getName(), null);
|
.getName(), new HashMap<>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +94,7 @@ public static class Dummy2FilterInitializer extends FilterInitializer {
|
|||||||
@Override
|
@Override
|
||||||
public void initFilter(FilterContainer container, Configuration conf) {
|
public void initFilter(FilterContainer container, Configuration conf) {
|
||||||
container.addFilter("Dummy2Auth", Dummy2AuthenticationFilter.class
|
container.addFilter("Dummy2Auth", Dummy2AuthenticationFilter.class
|
||||||
.getName(), null);
|
.getName(), new HashMap<>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +150,7 @@ public void testSessionCookie() throws IOException {
|
|||||||
String header = conn.getHeaderField("Set-Cookie");
|
String header = conn.getHeaderField("Set-Cookie");
|
||||||
List<HttpCookie> cookies = HttpCookie.parse(header);
|
List<HttpCookie> cookies = HttpCookie.parse(header);
|
||||||
Assert.assertTrue(!cookies.isEmpty());
|
Assert.assertTrue(!cookies.isEmpty());
|
||||||
Log.info(header);
|
Log.getLog().info(header);
|
||||||
Assert.assertFalse(header.contains("; Expires="));
|
Assert.assertFalse(header.contains("; Expires="));
|
||||||
Assert.assertTrue("token".equals(cookies.get(0).getValue()));
|
Assert.assertTrue("token".equals(cookies.get(0).getValue()));
|
||||||
}
|
}
|
||||||
@ -171,7 +172,7 @@ public void testPersistentCookie() throws IOException {
|
|||||||
String header = conn.getHeaderField("Set-Cookie");
|
String header = conn.getHeaderField("Set-Cookie");
|
||||||
List<HttpCookie> cookies = HttpCookie.parse(header);
|
List<HttpCookie> cookies = HttpCookie.parse(header);
|
||||||
Assert.assertTrue(!cookies.isEmpty());
|
Assert.assertTrue(!cookies.isEmpty());
|
||||||
Log.info(header);
|
Log.getLog().info(header);
|
||||||
Assert.assertTrue(header.contains("; Expires="));
|
Assert.assertTrue(header.contains("; Expires="));
|
||||||
Assert.assertTrue("token".equals(cookies.get(0).getValue()));
|
Assert.assertTrue("token".equals(cookies.get(0).getValue()));
|
||||||
}
|
}
|
||||||
|
@ -18,9 +18,9 @@
|
|||||||
package org.apache.hadoop.http;
|
package org.apache.hadoop.http;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
import org.eclipse.jetty.server.NCSARequestLog;
|
||||||
|
import org.eclipse.jetty.server.RequestLog;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.NCSARequestLog;
|
|
||||||
import org.mortbay.jetty.RequestLog;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
import org.apache.hadoop.security.ShellBasedUnixGroupsMapping;
|
import org.apache.hadoop.security.ShellBasedUnixGroupsMapping;
|
||||||
import org.apache.hadoop.security.UserGroupInformation;
|
import org.apache.hadoop.security.UserGroupInformation;
|
||||||
import org.apache.hadoop.security.authorize.AccessControlList;
|
import org.apache.hadoop.security.authorize.AccessControlList;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
@ -36,8 +38,6 @@
|
|||||||
import org.junit.rules.ExpectedException;
|
import org.junit.rules.ExpectedException;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
import org.mockito.internal.util.reflection.Whitebox;
|
import org.mockito.internal.util.reflection.Whitebox;
|
||||||
import org.mortbay.jetty.Connector;
|
|
||||||
import org.mortbay.util.ajax.JSON;
|
|
||||||
|
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
import javax.servlet.FilterChain;
|
import javax.servlet.FilterChain;
|
||||||
@ -50,6 +50,7 @@
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletRequestWrapper;
|
import javax.servlet.http.HttpServletRequestWrapper;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
@ -81,6 +82,7 @@ public static class EchoMapServlet extends HttpServlet {
|
|||||||
public void doGet(HttpServletRequest request,
|
public void doGet(HttpServletRequest request,
|
||||||
HttpServletResponse response
|
HttpServletResponse response
|
||||||
) throws ServletException, IOException {
|
) throws ServletException, IOException {
|
||||||
|
response.setContentType(MediaType.TEXT_PLAIN + "; " + JettyUtils.UTF_8);
|
||||||
PrintWriter out = response.getWriter();
|
PrintWriter out = response.getWriter();
|
||||||
Map<String, String[]> params = request.getParameterMap();
|
Map<String, String[]> params = request.getParameterMap();
|
||||||
SortedSet<String> keys = new TreeSet<String>(params.keySet());
|
SortedSet<String> keys = new TreeSet<String>(params.keySet());
|
||||||
@ -108,6 +110,7 @@ public static class EchoServlet extends HttpServlet {
|
|||||||
public void doGet(HttpServletRequest request,
|
public void doGet(HttpServletRequest request,
|
||||||
HttpServletResponse response
|
HttpServletResponse response
|
||||||
) throws ServletException, IOException {
|
) throws ServletException, IOException {
|
||||||
|
response.setContentType(MediaType.TEXT_PLAIN + "; " + JettyUtils.UTF_8);
|
||||||
PrintWriter out = response.getWriter();
|
PrintWriter out = response.getWriter();
|
||||||
SortedSet<String> sortedKeys = new TreeSet<String>();
|
SortedSet<String> sortedKeys = new TreeSet<String>();
|
||||||
Enumeration<String> keys = request.getParameterNames();
|
Enumeration<String> keys = request.getParameterNames();
|
||||||
@ -130,7 +133,7 @@ public static class HtmlContentServlet extends HttpServlet {
|
|||||||
public void doGet(HttpServletRequest request,
|
public void doGet(HttpServletRequest request,
|
||||||
HttpServletResponse response
|
HttpServletResponse response
|
||||||
) throws ServletException, IOException {
|
) throws ServletException, IOException {
|
||||||
response.setContentType("text/html");
|
response.setContentType(MediaType.TEXT_HTML + "; " + JettyUtils.UTF_8);
|
||||||
PrintWriter out = response.getWriter();
|
PrintWriter out = response.getWriter();
|
||||||
out.print("hello world");
|
out.print("hello world");
|
||||||
out.close();
|
out.close();
|
||||||
@ -222,7 +225,8 @@ public void run() {
|
|||||||
conn = (HttpURLConnection)servletUrl.openConnection();
|
conn = (HttpURLConnection)servletUrl.openConnection();
|
||||||
conn.connect();
|
conn.connect();
|
||||||
assertEquals(200, conn.getResponseCode());
|
assertEquals(200, conn.getResponseCode());
|
||||||
assertEquals("text/plain; charset=utf-8", conn.getContentType());
|
assertEquals(MediaType.TEXT_PLAIN + ";" + JettyUtils.UTF_8,
|
||||||
|
conn.getContentType());
|
||||||
|
|
||||||
// We should ignore parameters for mime types - ie a parameter
|
// We should ignore parameters for mime types - ie a parameter
|
||||||
// ending in .css should not change mime type
|
// ending in .css should not change mime type
|
||||||
@ -230,14 +234,16 @@ public void run() {
|
|||||||
conn = (HttpURLConnection)servletUrl.openConnection();
|
conn = (HttpURLConnection)servletUrl.openConnection();
|
||||||
conn.connect();
|
conn.connect();
|
||||||
assertEquals(200, conn.getResponseCode());
|
assertEquals(200, conn.getResponseCode());
|
||||||
assertEquals("text/plain; charset=utf-8", conn.getContentType());
|
assertEquals(MediaType.TEXT_PLAIN + ";" + JettyUtils.UTF_8,
|
||||||
|
conn.getContentType());
|
||||||
|
|
||||||
// Servlets that specify text/html should get that content type
|
// Servlets that specify text/html should get that content type
|
||||||
servletUrl = new URL(baseUrl, "/htmlcontent");
|
servletUrl = new URL(baseUrl, "/htmlcontent");
|
||||||
conn = (HttpURLConnection)servletUrl.openConnection();
|
conn = (HttpURLConnection)servletUrl.openConnection();
|
||||||
conn.connect();
|
conn.connect();
|
||||||
assertEquals(200, conn.getResponseCode());
|
assertEquals(200, conn.getResponseCode());
|
||||||
assertEquals("text/html; charset=utf-8", conn.getContentType());
|
assertEquals(MediaType.TEXT_HTML + ";" + JettyUtils.UTF_8,
|
||||||
|
conn.getContentType());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -592,7 +598,7 @@ private HttpServer2 checkBindAddress(String host, int port, boolean findPort)
|
|||||||
// not bound, ephemeral should return requested port (0 for ephemeral)
|
// not bound, ephemeral should return requested port (0 for ephemeral)
|
||||||
List<?> listeners = (List<?>) Whitebox.getInternalState(server,
|
List<?> listeners = (List<?>) Whitebox.getInternalState(server,
|
||||||
"listeners");
|
"listeners");
|
||||||
Connector listener = (Connector) listeners.get(0);
|
ServerConnector listener = (ServerConnector)listeners.get(0);
|
||||||
|
|
||||||
assertEquals(port, listener.getPort());
|
assertEquals(port, listener.getPort());
|
||||||
// verify hostname is what was given
|
// verify hostname is what was given
|
||||||
|
@ -146,9 +146,11 @@ public void testServletFilter() throws Exception {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static public class ErrorFilter extends SimpleFilter {
|
static public class ErrorFilter extends SimpleFilter {
|
||||||
|
static final String EXCEPTION_MESSAGE =
|
||||||
|
"Throwing the exception from Filter init";
|
||||||
@Override
|
@Override
|
||||||
public void init(FilterConfig arg0) throws ServletException {
|
public void init(FilterConfig arg0) throws ServletException {
|
||||||
throw new ServletException("Throwing the exception from Filter init");
|
throw new ServletException(EXCEPTION_MESSAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Configuration for the filter */
|
/** Configuration for the filter */
|
||||||
@ -174,7 +176,8 @@ public void testServletFilterWhenInitThrowsException() throws Exception {
|
|||||||
http.start();
|
http.start();
|
||||||
fail("expecting exception");
|
fail("expecting exception");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
assertTrue( e.getMessage().contains("Problem in starting http server. Server handlers failed"));
|
assertEquals("Problem starting http server", e.getMessage());
|
||||||
|
assertEquals(ErrorFilter.EXCEPTION_MESSAGE, e.getCause().getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,8 @@
|
|||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple Jersey resource class TestHttpServer.
|
* A simple Jersey resource class TestHttpServer.
|
||||||
@ -48,7 +49,7 @@ public class JerseyResource {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{" + PATH + ":.*}")
|
@Path("{" + PATH + ":.*}")
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response get(
|
public Response get(
|
||||||
@PathParam(PATH) @DefaultValue("UNKNOWN_" + PATH) final String path,
|
@PathParam(PATH) @DefaultValue("UNKNOWN_" + PATH) final String path,
|
||||||
@QueryParam(OP) @DefaultValue("UNKNOWN_" + OP) final String op
|
@QueryParam(OP) @DefaultValue("UNKNOWN_" + OP) final String op
|
||||||
|
@ -31,22 +31,22 @@
|
|||||||
import org.apache.hadoop.security.authentication.util.KerberosUtil;
|
import org.apache.hadoop.security.authentication.util.KerberosUtil;
|
||||||
import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSecretManager;
|
import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSecretManager;
|
||||||
import org.codehaus.jackson.map.ObjectMapper;
|
import org.codehaus.jackson.map.ObjectMapper;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.AbstractConnector;
|
import org.eclipse.jetty.servlet.FilterHolder;
|
||||||
import org.mortbay.jetty.Connector;
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.mortbay.jetty.Server;
|
|
||||||
import org.mortbay.jetty.servlet.Context;
|
|
||||||
import org.mortbay.jetty.servlet.FilterHolder;
|
|
||||||
import org.mortbay.jetty.servlet.ServletHolder;
|
|
||||||
|
|
||||||
import javax.security.auth.Subject;
|
import javax.security.auth.Subject;
|
||||||
import javax.security.auth.kerberos.KerberosPrincipal;
|
import javax.security.auth.kerberos.KerberosPrincipal;
|
||||||
import javax.security.auth.login.AppConfigurationEntry;
|
import javax.security.auth.login.AppConfigurationEntry;
|
||||||
import javax.security.auth.login.Configuration;
|
import javax.security.auth.login.Configuration;
|
||||||
import javax.security.auth.login.LoginContext;
|
import javax.security.auth.login.LoginContext;
|
||||||
|
import javax.servlet.DispatcherType;
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
import javax.servlet.FilterConfig;
|
import javax.servlet.FilterConfig;
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
@ -66,6 +66,7 @@
|
|||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
import java.security.PrivilegedActionException;
|
import java.security.PrivilegedActionException;
|
||||||
import java.security.PrivilegedExceptionAction;
|
import java.security.PrivilegedExceptionAction;
|
||||||
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -177,7 +178,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
|
|||||||
protected Server createJettyServer() {
|
protected Server createJettyServer() {
|
||||||
try {
|
try {
|
||||||
jetty = new Server(0);
|
jetty = new Server(0);
|
||||||
jetty.getConnectors()[0].setHost("localhost");
|
((ServerConnector)jetty.getConnectors()[0]).setHost("localhost");
|
||||||
return jetty;
|
return jetty;
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
throw new RuntimeException("Could not setup Jetty: " + ex.getMessage(),
|
throw new RuntimeException("Could not setup Jetty: " + ex.getMessage(),
|
||||||
@ -186,7 +187,7 @@ protected Server createJettyServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected String getJettyURL() {
|
protected String getJettyURL() {
|
||||||
Connector c = jetty.getConnectors()[0];
|
ServerConnector c = (ServerConnector)jetty.getConnectors()[0];
|
||||||
return "http://" + c.getHost() + ":" + c.getLocalPort();
|
return "http://" + c.getHost() + ":" + c.getLocalPort();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,10 +218,11 @@ protected Server getJetty() {
|
|||||||
@Test
|
@Test
|
||||||
public void testRawHttpCalls() throws Exception {
|
public void testRawHttpCalls() throws Exception {
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(AFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(AFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(PingServlet.class), "/bar");
|
context.addServlet(new ServletHolder(PingServlet.class), "/bar");
|
||||||
try {
|
try {
|
||||||
jetty.start();
|
jetty.start();
|
||||||
@ -337,10 +339,11 @@ public void testDelegationTokenAuthenticatorCallsWithQueryString()
|
|||||||
private void testDelegationTokenAuthenticatorCalls(final boolean useQS)
|
private void testDelegationTokenAuthenticatorCalls(final boolean useQS)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(AFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(AFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(PingServlet.class), "/bar");
|
context.addServlet(new ServletHolder(PingServlet.class), "/bar");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -446,10 +449,11 @@ public void testExternalDelegationTokenSecretManager() throws Exception {
|
|||||||
DummyDelegationTokenSecretManager secretMgr
|
DummyDelegationTokenSecretManager secretMgr
|
||||||
= new DummyDelegationTokenSecretManager();
|
= new DummyDelegationTokenSecretManager();
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(AFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(AFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(PingServlet.class), "/bar");
|
context.addServlet(new ServletHolder(PingServlet.class), "/bar");
|
||||||
try {
|
try {
|
||||||
secretMgr.startThreads();
|
secretMgr.startThreads();
|
||||||
@ -525,10 +529,11 @@ public void testDelegationTokenAuthenticationURLWithNoDTHandler()
|
|||||||
private void testDelegationTokenAuthenticatedURLWithNoDT(
|
private void testDelegationTokenAuthenticatedURLWithNoDT(
|
||||||
Class<? extends Filter> filterClass) throws Exception {
|
Class<? extends Filter> filterClass) throws Exception {
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(filterClass), "/*", 0);
|
context.addFilter(new FilterHolder(filterClass), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -594,10 +599,11 @@ protected org.apache.hadoop.conf.Configuration getProxyuserConfiguration(
|
|||||||
public void testFallbackToPseudoDelegationTokenAuthenticator()
|
public void testFallbackToPseudoDelegationTokenAuthenticator()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(PseudoDTAFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(PseudoDTAFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -745,11 +751,11 @@ private void testKerberosDelegationTokenAuthenticator(
|
|||||||
Assert.assertTrue(testDir.mkdirs());
|
Assert.assertTrue(testDir.mkdirs());
|
||||||
MiniKdc kdc = new MiniKdc(MiniKdc.createConf(), testDir);
|
MiniKdc kdc = new MiniKdc(MiniKdc.createConf(), testDir);
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
((AbstractConnector)jetty.getConnectors()[0]).setResolveNames(true);
|
context.addFilter(new FilterHolder(KDTAFilter.class), "/*",
|
||||||
context.addFilter(new FilterHolder(KDTAFilter.class), "/*", 0);
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
||||||
try {
|
try {
|
||||||
kdc.start();
|
kdc.start();
|
||||||
@ -824,10 +830,11 @@ public Void call() throws Exception {
|
|||||||
@Test
|
@Test
|
||||||
public void testProxyUser() throws Exception {
|
public void testProxyUser() throws Exception {
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(PseudoDTAFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(PseudoDTAFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
context.addServlet(new ServletHolder(UserServlet.class), "/bar");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -921,10 +928,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
|
|||||||
@Test
|
@Test
|
||||||
public void testHttpUGI() throws Exception {
|
public void testHttpUGI() throws Exception {
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
context.addFilter(new FilterHolder(PseudoDTAFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(PseudoDTAFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(UGIServlet.class), "/bar");
|
context.addServlet(new ServletHolder(UGIServlet.class), "/bar");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -980,12 +988,12 @@ public static class IpAddressBasedPseudoDTAFilter extends PseudoDTAFilter {
|
|||||||
@Test
|
@Test
|
||||||
public void testIpaddressCheck() throws Exception {
|
public void testIpaddressCheck() throws Exception {
|
||||||
final Server jetty = createJettyServer();
|
final Server jetty = createJettyServer();
|
||||||
((AbstractConnector)jetty.getConnectors()[0]).setResolveNames(true);
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
Context context = new Context();
|
|
||||||
context.setContextPath("/foo");
|
context.setContextPath("/foo");
|
||||||
jetty.setHandler(context);
|
jetty.setHandler(context);
|
||||||
|
|
||||||
context.addFilter(new FilterHolder(IpAddressBasedPseudoDTAFilter.class), "/*", 0);
|
context.addFilter(new FilterHolder(IpAddressBasedPseudoDTAFilter.class), "/*",
|
||||||
|
EnumSet.of(DispatcherType.REQUEST));
|
||||||
context.addServlet(new ServletHolder(UGIServlet.class), "/bar");
|
context.addServlet(new ServletHolder(UGIServlet.class), "/bar");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -80,12 +80,12 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -111,7 +111,7 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
@ -122,19 +122,19 @@
|
|||||||
<artifactId>jsp-api</artifactId>
|
<artifactId>jsp-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jsp-api-2.1</artifactId>
|
<artifactId>jsp-api-2.1</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>servlet-api-2.5</artifactId>
|
<artifactId>servlet-api-2.5</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
@ -178,7 +178,7 @@
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
import org.apache.hadoop.crypto.key.KeyProviderCryptoExtension;
|
import org.apache.hadoop.crypto.key.KeyProviderCryptoExtension;
|
||||||
import org.apache.hadoop.crypto.key.KeyProviderCryptoExtension.EncryptedKeyVersion;
|
import org.apache.hadoop.crypto.key.KeyProviderCryptoExtension.EncryptedKeyVersion;
|
||||||
import org.apache.hadoop.crypto.key.kms.KMSRESTConstants;
|
import org.apache.hadoop.crypto.key.kms.KMSRESTConstants;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.security.AccessControlException;
|
import org.apache.hadoop.security.AccessControlException;
|
||||||
import org.apache.hadoop.security.UserGroupInformation;
|
import org.apache.hadoop.security.UserGroupInformation;
|
||||||
import org.apache.hadoop.crypto.key.kms.KMSClientProvider;
|
import org.apache.hadoop.crypto.key.kms.KMSClientProvider;
|
||||||
@ -101,7 +102,7 @@ private static URI getKeyURI(String domain, String keyName) {
|
|||||||
@POST
|
@POST
|
||||||
@Path(KMSRESTConstants.KEYS_RESOURCE)
|
@Path(KMSRESTConstants.KEYS_RESOURCE)
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public Response createKey(Map jsonKey) throws Exception {
|
public Response createKey(Map jsonKey) throws Exception {
|
||||||
try{
|
try{
|
||||||
@ -204,7 +205,7 @@ public Void run() throws Exception {
|
|||||||
@POST
|
@POST
|
||||||
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}")
|
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}")
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response rolloverKey(@PathParam("name") final String name,
|
public Response rolloverKey(@PathParam("name") final String name,
|
||||||
Map jsonMaterial) throws Exception {
|
Map jsonMaterial) throws Exception {
|
||||||
try {
|
try {
|
||||||
@ -254,7 +255,7 @@ public KeyVersion run() throws Exception {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path(KMSRESTConstants.KEYS_METADATA_RESOURCE)
|
@Path(KMSRESTConstants.KEYS_METADATA_RESOURCE)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response getKeysMetadata(@QueryParam(KMSRESTConstants.KEY)
|
public Response getKeysMetadata(@QueryParam(KMSRESTConstants.KEY)
|
||||||
List<String> keyNamesList) throws Exception {
|
List<String> keyNamesList) throws Exception {
|
||||||
try {
|
try {
|
||||||
@ -287,7 +288,7 @@ public KeyProvider.Metadata[] run() throws Exception {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path(KMSRESTConstants.KEYS_NAMES_RESOURCE)
|
@Path(KMSRESTConstants.KEYS_NAMES_RESOURCE)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response getKeyNames() throws Exception {
|
public Response getKeyNames() throws Exception {
|
||||||
try {
|
try {
|
||||||
LOG.trace("Entering getKeyNames method.");
|
LOG.trace("Entering getKeyNames method.");
|
||||||
@ -332,7 +333,7 @@ public Response getKey(@PathParam("name") String name)
|
|||||||
@GET
|
@GET
|
||||||
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
||||||
KMSRESTConstants.METADATA_SUB_RESOURCE)
|
KMSRESTConstants.METADATA_SUB_RESOURCE)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response getMetadata(@PathParam("name") final String name)
|
public Response getMetadata(@PathParam("name") final String name)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
try {
|
try {
|
||||||
@ -366,7 +367,7 @@ public KeyProvider.Metadata run() throws Exception {
|
|||||||
@GET
|
@GET
|
||||||
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
||||||
KMSRESTConstants.CURRENT_VERSION_SUB_RESOURCE)
|
KMSRESTConstants.CURRENT_VERSION_SUB_RESOURCE)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response getCurrentVersion(@PathParam("name") final String name)
|
public Response getCurrentVersion(@PathParam("name") final String name)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
try {
|
try {
|
||||||
@ -399,7 +400,7 @@ public KeyVersion run() throws Exception {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path(KMSRESTConstants.KEY_VERSION_RESOURCE + "/{versionName:.*}")
|
@Path(KMSRESTConstants.KEY_VERSION_RESOURCE + "/{versionName:.*}")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response getKeyVersion(
|
public Response getKeyVersion(
|
||||||
@PathParam("versionName") final String versionName) throws Exception {
|
@PathParam("versionName") final String versionName) throws Exception {
|
||||||
try {
|
try {
|
||||||
@ -436,7 +437,7 @@ public KeyVersion run() throws Exception {
|
|||||||
@GET
|
@GET
|
||||||
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
||||||
KMSRESTConstants.EEK_SUB_RESOURCE)
|
KMSRESTConstants.EEK_SUB_RESOURCE)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response generateEncryptedKeys(
|
public Response generateEncryptedKeys(
|
||||||
@PathParam("name") final String name,
|
@PathParam("name") final String name,
|
||||||
@QueryParam(KMSRESTConstants.EEK_OP) String edekOp,
|
@QueryParam(KMSRESTConstants.EEK_OP) String edekOp,
|
||||||
@ -508,7 +509,7 @@ public Void run() throws Exception {
|
|||||||
@POST
|
@POST
|
||||||
@Path(KMSRESTConstants.KEY_VERSION_RESOURCE + "/{versionName:.*}/" +
|
@Path(KMSRESTConstants.KEY_VERSION_RESOURCE + "/{versionName:.*}/" +
|
||||||
KMSRESTConstants.EEK_SUB_RESOURCE)
|
KMSRESTConstants.EEK_SUB_RESOURCE)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response decryptEncryptedKey(
|
public Response decryptEncryptedKey(
|
||||||
@PathParam("versionName") final String versionName,
|
@PathParam("versionName") final String versionName,
|
||||||
@QueryParam(KMSRESTConstants.EEK_OP) String eekOp,
|
@QueryParam(KMSRESTConstants.EEK_OP) String eekOp,
|
||||||
@ -577,7 +578,7 @@ public KeyVersion run() throws Exception {
|
|||||||
@GET
|
@GET
|
||||||
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
@Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" +
|
||||||
KMSRESTConstants.VERSIONS_SUB_RESOURCE)
|
KMSRESTConstants.VERSIONS_SUB_RESOURCE)
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response getKeyVersions(@PathParam("name") final String name)
|
public Response getKeyVersions(@PathParam("name") final String name)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
try {
|
try {
|
||||||
|
@ -114,7 +114,19 @@ public void sendError(int sc) throws IOException {
|
|||||||
super.sendError(sc);
|
super.sendError(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls setStatus(int sc, String msg) on the wrapped
|
||||||
|
* {@link HttpServletResponseWrapper} object.
|
||||||
|
*
|
||||||
|
* @param sc the status code
|
||||||
|
* @param sm the status message
|
||||||
|
* @deprecated {@link HttpServletResponseWrapper#setStatus(int, String)} is
|
||||||
|
* deprecated. To set a status code use {@link #setStatus(int)}, to send an
|
||||||
|
* error with a description use {@link #sendError(int, String)}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void setStatus(int sc, String sm) {
|
public void setStatus(int sc, String sm) {
|
||||||
statusCode = sc;
|
statusCode = sc;
|
||||||
msg = sm;
|
msg = sm;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
package org.apache.hadoop.crypto.key.kms.server;
|
package org.apache.hadoop.crypto.key.kms.server;
|
||||||
|
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.codehaus.jackson.map.ObjectMapper;
|
import org.codehaus.jackson.map.ObjectMapper;
|
||||||
|
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
@ -41,7 +42,7 @@
|
|||||||
* to their JSON representation.
|
* to their JSON representation.
|
||||||
*/
|
*/
|
||||||
@Provider
|
@Provider
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
public class KMSJSONWriter implements MessageBodyWriter<Object> {
|
public class KMSJSONWriter implements MessageBodyWriter<Object> {
|
||||||
|
|
||||||
|
@ -21,14 +21,19 @@
|
|||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.crypto.key.kms.KMSRESTConstants;
|
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.util.ThreadUtil;
|
import org.apache.hadoop.util.ThreadUtil;
|
||||||
import org.apache.hadoop.security.ssl.SslSelectChannelConnectorSecure;
|
import org.eclipse.jetty.http.HttpVersion;
|
||||||
import org.mortbay.jetty.Connector;
|
import org.eclipse.jetty.server.ConnectionFactory;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.HttpConfiguration;
|
||||||
import org.mortbay.jetty.security.SslSelectChannelConnector;
|
import org.eclipse.jetty.server.HttpConnectionFactory;
|
||||||
import org.mortbay.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.server.SecureRequestCustomizer;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.SslConnectionFactory;
|
||||||
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -37,11 +42,7 @@
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.ServerSocket;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.net.URISyntaxException;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -51,18 +52,28 @@ private static Server createJettyServer(String keyStore, String password, int in
|
|||||||
try {
|
try {
|
||||||
boolean ssl = keyStore != null;
|
boolean ssl = keyStore != null;
|
||||||
String host = "localhost";
|
String host = "localhost";
|
||||||
Server server = new Server(inPort);
|
Server server = new Server();
|
||||||
if (!ssl) {
|
ServerConnector conn = new ServerConnector(server);
|
||||||
server.getConnectors()[0].setHost(host);
|
HttpConfiguration httpConfig = new HttpConfiguration();
|
||||||
} else {
|
httpConfig.setRequestHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
SslSelectChannelConnector c = new SslSelectChannelConnectorSecure();
|
httpConfig.setResponseHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
c.setHost(host);
|
httpConfig.setSecureScheme("https");
|
||||||
c.setNeedClientAuth(false);
|
httpConfig.addCustomizer(new SecureRequestCustomizer());
|
||||||
c.setKeystore(keyStore);
|
ConnectionFactory connFactory = new HttpConnectionFactory(httpConfig);
|
||||||
c.setKeystoreType("jks");
|
conn.addConnectionFactory(connFactory);
|
||||||
c.setKeyPassword(password);
|
conn.setHost(host);
|
||||||
server.setConnectors(new Connector[]{c});
|
conn.setPort(inPort);
|
||||||
|
if (ssl) {
|
||||||
|
SslContextFactory sslContextFactory = new SslContextFactory();
|
||||||
|
sslContextFactory.setNeedClientAuth(false);
|
||||||
|
sslContextFactory.setKeyStorePath(keyStore);
|
||||||
|
sslContextFactory.setKeyStoreType("jks");
|
||||||
|
sslContextFactory.setKeyStorePassword(password);
|
||||||
|
conn.addFirstConnectionFactory(
|
||||||
|
new SslConnectionFactory(sslContextFactory,
|
||||||
|
HttpVersion.HTTP_1_1.asString()));
|
||||||
}
|
}
|
||||||
|
server.addConnector(conn);
|
||||||
return server;
|
return server;
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
throw new RuntimeException("Could not start embedded servlet container, "
|
throw new RuntimeException("Could not start embedded servlet container, "
|
||||||
@ -71,13 +82,13 @@ private static Server createJettyServer(String keyStore, String password, int in
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static URL getJettyURL(Server server) {
|
private static URL getJettyURL(Server server) {
|
||||||
boolean ssl = server.getConnectors()[0].getClass()
|
boolean ssl = server.getConnectors()[0]
|
||||||
== SslSelectChannelConnectorSecure.class;
|
.getConnectionFactory(SslConnectionFactory.class) != null;
|
||||||
try {
|
try {
|
||||||
String scheme = (ssl) ? "https" : "http";
|
String scheme = (ssl) ? "https" : "http";
|
||||||
return new URL(scheme + "://" +
|
return new URL(scheme + "://" +
|
||||||
server.getConnectors()[0].getHost() + ":" +
|
((ServerConnector)server.getConnectors()[0]).getHost() + ":"
|
||||||
server.getConnectors()[0].getLocalPort());
|
+ ((ServerConnector)server.getConnectors()[0]).getLocalPort());
|
||||||
} catch (MalformedURLException ex) {
|
} catch (MalformedURLException ex) {
|
||||||
throw new RuntimeException("It should never happen, " + ex.getMessage(),
|
throw new RuntimeException("It should never happen, " + ex.getMessage(),
|
||||||
ex);
|
ex);
|
||||||
@ -217,7 +228,7 @@ public void start() throws Exception {
|
|||||||
if (webXmlInJar) {
|
if (webXmlInJar) {
|
||||||
context.setClassLoader(cl);
|
context.setClassLoader(cl);
|
||||||
}
|
}
|
||||||
jetty.addHandler(context);
|
jetty.setHandler(context);
|
||||||
jetty.start();
|
jetty.start();
|
||||||
kmsURL = new URL(getJettyURL(jetty), "kms");
|
kmsURL = new URL(getJettyURL(jetty), "kms");
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -75,7 +75,7 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -89,8 +89,8 @@
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -108,22 +108,22 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet.jsp</groupId>
|
<groupId>javax.servlet.jsp</groupId>
|
||||||
<artifactId>jsp-api</artifactId>
|
<artifactId>jsp-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>servlet-api-2.5</artifactId>
|
<artifactId>servlet-api-2.5</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
@ -155,18 +155,18 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>servlet-api-2.5</artifactId>
|
<artifactId>servlet-api-2.5</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
import org.apache.hadoop.fs.http.server.HttpFSParametersProvider.XAttrNameParam;
|
import org.apache.hadoop.fs.http.server.HttpFSParametersProvider.XAttrNameParam;
|
||||||
import org.apache.hadoop.fs.http.server.HttpFSParametersProvider.XAttrSetFlagParam;
|
import org.apache.hadoop.fs.http.server.HttpFSParametersProvider.XAttrSetFlagParam;
|
||||||
import org.apache.hadoop.fs.http.server.HttpFSParametersProvider.XAttrValueParam;
|
import org.apache.hadoop.fs.http.server.HttpFSParametersProvider.XAttrValueParam;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.lib.service.FileSystemAccess;
|
import org.apache.hadoop.lib.service.FileSystemAccess;
|
||||||
import org.apache.hadoop.lib.service.FileSystemAccessException;
|
import org.apache.hadoop.lib.service.FileSystemAccessException;
|
||||||
import org.apache.hadoop.lib.service.Groups;
|
import org.apache.hadoop.lib.service.Groups;
|
||||||
@ -168,7 +169,7 @@ private void enforceRootPath(HttpFSFileSystem.Operation op, String path) {
|
|||||||
* {@link HttpFSExceptionProvider}.
|
* {@link HttpFSExceptionProvider}.
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response getRoot(@QueryParam(OperationParam.NAME) OperationParam op,
|
public Response getRoot(@QueryParam(OperationParam.NAME) OperationParam op,
|
||||||
@Context Parameters params,
|
@Context Parameters params,
|
||||||
@Context HttpServletRequest request)
|
@Context HttpServletRequest request)
|
||||||
@ -197,7 +198,8 @@ private String makeAbsolute(String path) {
|
|||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Path("{path:.*}")
|
@Path("{path:.*}")
|
||||||
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response get(@PathParam("path") String path,
|
public Response get(@PathParam("path") String path,
|
||||||
@QueryParam(OperationParam.NAME) OperationParam op,
|
@QueryParam(OperationParam.NAME) OperationParam op,
|
||||||
@Context Parameters params,
|
@Context Parameters params,
|
||||||
@ -363,7 +365,7 @@ public InputStream run() throws Exception {
|
|||||||
*/
|
*/
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("{path:.*}")
|
@Path("{path:.*}")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response delete(@PathParam("path") String path,
|
public Response delete(@PathParam("path") String path,
|
||||||
@QueryParam(OperationParam.NAME) OperationParam op,
|
@QueryParam(OperationParam.NAME) OperationParam op,
|
||||||
@Context Parameters params,
|
@Context Parameters params,
|
||||||
@ -414,7 +416,7 @@ public Response delete(@PathParam("path") String path,
|
|||||||
@POST
|
@POST
|
||||||
@Path("{path:.*}")
|
@Path("{path:.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response post(InputStream is,
|
public Response post(InputStream is,
|
||||||
@Context UriInfo uriInfo,
|
@Context UriInfo uriInfo,
|
||||||
@PathParam("path") String path,
|
@PathParam("path") String path,
|
||||||
@ -509,7 +511,7 @@ protected URI createUploadRedirectionURL(UriInfo uriInfo, Enum<?> uploadOperatio
|
|||||||
@PUT
|
@PUT
|
||||||
@Path("{path:.*}")
|
@Path("{path:.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response put(InputStream is,
|
public Response put(InputStream is,
|
||||||
@Context UriInfo uriInfo,
|
@Context UriInfo uriInfo,
|
||||||
@PathParam("path") String path,
|
@PathParam("path") String path,
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.apache.hadoop.lib.wsrs;
|
package org.apache.hadoop.lib.wsrs;
|
||||||
|
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
@ -37,7 +38,7 @@
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Provider
|
@Provider
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
public class JSONMapProvider implements MessageBodyWriter<Map> {
|
public class JSONMapProvider implements MessageBodyWriter<Map> {
|
||||||
private static final String ENTER = System.getProperty("line.separator");
|
private static final String ENTER = System.getProperty("line.separator");
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package org.apache.hadoop.lib.wsrs;
|
package org.apache.hadoop.lib.wsrs;
|
||||||
|
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.json.simple.JSONStreamAware;
|
import org.json.simple.JSONStreamAware;
|
||||||
|
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
@ -36,7 +37,7 @@
|
|||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
@Provider
|
@Provider
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
public class JSONProvider implements MessageBodyWriter<JSONStreamAware> {
|
public class JSONProvider implements MessageBodyWriter<JSONStreamAware> {
|
||||||
private static final String ENTER = System.getProperty("line.separator");
|
private static final String ENTER = System.getProperty("line.separator");
|
||||||
|
@ -49,8 +49,8 @@
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.junit.runners.Parameterized;
|
import org.junit.runners.Parameterized;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ private void createHttpFSServer() throws Exception {
|
|||||||
URL url = cl.getResource("webapp");
|
URL url = cl.getResource("webapp");
|
||||||
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
||||||
Server server = TestJettyHelper.getJettyServer();
|
Server server = TestJettyHelper.getJettyServer();
|
||||||
server.addHandler(context);
|
server.setHandler(context);
|
||||||
server.start();
|
server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,8 +64,8 @@
|
|||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
import org.json.simple.parser.JSONParser;
|
import org.json.simple.parser.JSONParser;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
@ -171,7 +171,7 @@ private void createHttpFSServer(boolean addDelegationTokenAuthHandler)
|
|||||||
URL url = cl.getResource("webapp");
|
URL url = cl.getResource("webapp");
|
||||||
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
||||||
Server server = TestJettyHelper.getJettyServer();
|
Server server = TestJettyHelper.getJettyServer();
|
||||||
server.addHandler(context);
|
server.setHandler(context);
|
||||||
server.start();
|
server.start();
|
||||||
if (addDelegationTokenAuthHandler) {
|
if (addDelegationTokenAuthHandler) {
|
||||||
HttpFSServerWebApp.get().setAuthority(TestJettyHelper.getAuthority());
|
HttpFSServerWebApp.get().setAuthority(TestJettyHelper.getAuthority());
|
||||||
|
@ -31,8 +31,8 @@
|
|||||||
import org.apache.hadoop.test.TestJettyHelper;
|
import org.apache.hadoop.test.TestJettyHelper;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -151,7 +151,7 @@ private void createHttpFSServer() throws Exception {
|
|||||||
}
|
}
|
||||||
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
||||||
Server server = TestJettyHelper.getJettyServer();
|
Server server = TestJettyHelper.getJettyServer();
|
||||||
server.addHandler(context);
|
server.setHandler(context);
|
||||||
server.start();
|
server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@
|
|||||||
import org.apache.hadoop.test.TestJettyHelper;
|
import org.apache.hadoop.test.TestJettyHelper;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -152,7 +152,7 @@ private void createHttpFSServer() throws Exception {
|
|||||||
}
|
}
|
||||||
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
||||||
Server server = TestJettyHelper.getJettyServer();
|
Server server = TestJettyHelper.getJettyServer();
|
||||||
server.addHandler(context);
|
server.setHandler(context);
|
||||||
server.start();
|
server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,8 +41,8 @@
|
|||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.webapp.WebAppContext;
|
import org.eclipse.jetty.webapp.WebAppContext;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -105,7 +105,7 @@ private void createHttpFSServer() throws Exception {
|
|||||||
URL url = cl.getResource("webapp");
|
URL url = cl.getResource("webapp");
|
||||||
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs");
|
||||||
Server server = TestJettyHelper.getJettyServer();
|
Server server = TestJettyHelper.getJettyServer();
|
||||||
server.addHandler(context);
|
server.setHandler(context);
|
||||||
server.start();
|
server.start();
|
||||||
HttpFSServerWebApp.get().setAuthority(TestJettyHelper.getAuthority());
|
HttpFSServerWebApp.get().setAuthority(TestJettyHelper.getAuthority());
|
||||||
}
|
}
|
||||||
|
@ -38,9 +38,9 @@
|
|||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.util.Time;
|
import org.apache.hadoop.util.Time;
|
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.servlet.Context;
|
|
||||||
|
|
||||||
public class TestHFSTestCase extends HFSTestCase {
|
public class TestHFSTestCase extends HFSTestCase {
|
||||||
|
|
||||||
@ -165,11 +165,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
|
|||||||
@Test
|
@Test
|
||||||
@TestJetty
|
@TestJetty
|
||||||
public void testJetty() throws Exception {
|
public void testJetty() throws Exception {
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/");
|
context.setContextPath("/");
|
||||||
context.addServlet(MyServlet.class, "/bar");
|
context.addServlet(MyServlet.class, "/bar");
|
||||||
Server server = TestJettyHelper.getJettyServer();
|
Server server = TestJettyHelper.getJettyServer();
|
||||||
server.addHandler(context);
|
server.setHandler(context);
|
||||||
server.start();
|
server.start();
|
||||||
URL url = new URL(TestJettyHelper.getJettyURL(), "/bar");
|
URL url = new URL(TestJettyHelper.getJettyURL(), "/bar");
|
||||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||||
|
@ -33,9 +33,9 @@
|
|||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.hadoop.util.Time;
|
import org.apache.hadoop.util.Time;
|
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.servlet.Context;
|
|
||||||
|
|
||||||
public class TestHTestCase extends HTestCase {
|
public class TestHTestCase extends HTestCase {
|
||||||
|
|
||||||
@ -132,11 +132,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
|
|||||||
@Test
|
@Test
|
||||||
@TestJetty
|
@TestJetty
|
||||||
public void testJetty() throws Exception {
|
public void testJetty() throws Exception {
|
||||||
Context context = new Context();
|
ServletContextHandler context = new ServletContextHandler();
|
||||||
context.setContextPath("/");
|
context.setContextPath("/");
|
||||||
context.addServlet(MyServlet.class, "/bar");
|
context.addServlet(MyServlet.class, "/bar");
|
||||||
Server server = TestJettyHelper.getJettyServer();
|
Server server = TestJettyHelper.getJettyServer();
|
||||||
server.addHandler(context);
|
server.setHandler(context);
|
||||||
server.start();
|
server.start();
|
||||||
URL url = new URL(TestJettyHelper.getJettyURL(), "/bar");
|
URL url = new URL(TestJettyHelper.getJettyURL(), "/bar");
|
||||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||||
|
@ -24,14 +24,19 @@
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
|
||||||
import org.apache.hadoop.security.ssl.SslSelectChannelConnectorSecure;
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.junit.Test;
|
import org.eclipse.jetty.http.HttpVersion;
|
||||||
|
import org.eclipse.jetty.server.ConnectionFactory;
|
||||||
|
import org.eclipse.jetty.server.HttpConfiguration;
|
||||||
|
import org.eclipse.jetty.server.HttpConnectionFactory;
|
||||||
|
import org.eclipse.jetty.server.SecureRequestCustomizer;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
|
import org.eclipse.jetty.server.SslConnectionFactory;
|
||||||
|
import org.eclipse.jetty.util.ssl.SslContextFactory;
|
||||||
import org.junit.rules.MethodRule;
|
import org.junit.rules.MethodRule;
|
||||||
import org.junit.runners.model.FrameworkMethod;
|
import org.junit.runners.model.FrameworkMethod;
|
||||||
import org.junit.runners.model.Statement;
|
import org.junit.runners.model.Statement;
|
||||||
import org.mortbay.jetty.Connector;
|
|
||||||
import org.mortbay.jetty.Server;
|
|
||||||
import org.mortbay.jetty.security.SslSelectChannelConnector;
|
|
||||||
|
|
||||||
public class TestJettyHelper implements MethodRule {
|
public class TestJettyHelper implements MethodRule {
|
||||||
private boolean ssl;
|
private boolean ssl;
|
||||||
@ -88,20 +93,27 @@ private Server createJettyServer() {
|
|||||||
ServerSocket ss = new ServerSocket(0, 50, localhost);
|
ServerSocket ss = new ServerSocket(0, 50, localhost);
|
||||||
int port = ss.getLocalPort();
|
int port = ss.getLocalPort();
|
||||||
ss.close();
|
ss.close();
|
||||||
Server server = new Server(0);
|
Server server = new Server();
|
||||||
if (!ssl) {
|
ServerConnector conn = new ServerConnector(server);
|
||||||
server.getConnectors()[0].setHost(host);
|
HttpConfiguration http_config = new HttpConfiguration();
|
||||||
server.getConnectors()[0].setPort(port);
|
http_config.setRequestHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
} else {
|
http_config.setResponseHeaderSize(JettyUtils.HEADER_SIZE);
|
||||||
SslSelectChannelConnector c = new SslSelectChannelConnectorSecure();
|
http_config.setSecureScheme("https");
|
||||||
c.setHost(host);
|
http_config.addCustomizer(new SecureRequestCustomizer());
|
||||||
c.setPort(port);
|
ConnectionFactory connFactory = new HttpConnectionFactory(http_config);
|
||||||
c.setNeedClientAuth(false);
|
conn.addConnectionFactory(connFactory);
|
||||||
c.setKeystore(keyStore);
|
conn.setHost(host);
|
||||||
c.setKeystoreType(keyStoreType);
|
conn.setPort(port);
|
||||||
c.setKeyPassword(keyStorePassword);
|
if (ssl) {
|
||||||
server.setConnectors(new Connector[] {c});
|
SslContextFactory sslContextFactory = new SslContextFactory();
|
||||||
|
sslContextFactory.setNeedClientAuth(false);
|
||||||
|
sslContextFactory.setKeyStorePath(keyStore);
|
||||||
|
sslContextFactory.setKeyStoreType(keyStoreType);
|
||||||
|
sslContextFactory.setKeyStorePassword(keyStorePassword);
|
||||||
|
conn.addFirstConnectionFactory(new SslConnectionFactory(sslContextFactory,
|
||||||
|
HttpVersion.HTTP_1_1.asString()));
|
||||||
}
|
}
|
||||||
|
server.addConnector(conn);
|
||||||
return server;
|
return server;
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
throw new RuntimeException("Could not start embedded servlet container, " + ex.getMessage(), ex);
|
throw new RuntimeException("Could not start embedded servlet container, " + ex.getMessage(), ex);
|
||||||
@ -117,8 +129,8 @@ public static InetSocketAddress getAuthority() {
|
|||||||
Server server = getJettyServer();
|
Server server = getJettyServer();
|
||||||
try {
|
try {
|
||||||
InetAddress add =
|
InetAddress add =
|
||||||
InetAddress.getByName(server.getConnectors()[0].getHost());
|
InetAddress.getByName(((ServerConnector)server.getConnectors()[0]).getHost());
|
||||||
int port = server.getConnectors()[0].getPort();
|
int port = ((ServerConnector)server.getConnectors()[0]).getPort();
|
||||||
return new InetSocketAddress(add, port);
|
return new InetSocketAddress(add, port);
|
||||||
} catch (UnknownHostException ex) {
|
} catch (UnknownHostException ex) {
|
||||||
throw new RuntimeException(ex);
|
throw new RuntimeException(ex);
|
||||||
@ -157,8 +169,8 @@ public static URL getJettyURL() {
|
|||||||
try {
|
try {
|
||||||
String scheme = (helper.ssl) ? "https" : "http";
|
String scheme = (helper.ssl) ? "https" : "http";
|
||||||
return new URL(scheme + "://" +
|
return new URL(scheme + "://" +
|
||||||
helper.server.getConnectors()[0].getHost() + ":" +
|
((ServerConnector)helper.server.getConnectors()[0]).getHost() + ":" +
|
||||||
helper.server.getConnectors()[0].getPort());
|
((ServerConnector)helper.server.getConnectors()[0]).getPort());
|
||||||
} catch (MalformedURLException ex) {
|
} catch (MalformedURLException ex) {
|
||||||
throw new RuntimeException("It should never happen, " + ex.getMessage(), ex);
|
throw new RuntimeException("It should never happen, " + ex.getMessage(), ex);
|
||||||
}
|
}
|
||||||
|
@ -85,12 +85,12 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
@ -146,7 +146,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -75,15 +75,20 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-util-ajax</artifactId>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.jersey</groupId>
|
<groupId>com.sun.jersey</groupId>
|
||||||
<artifactId>jersey-core</artifactId>
|
<artifactId>jersey-core</artifactId>
|
||||||
@ -136,7 +141,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -356,6 +361,18 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|||||||
<output>${project.build.directory}/generated-sources/java</output>
|
<output>${project.build.directory}/generated-sources/java</output>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>resource-gz</id>
|
||||||
|
<phase>generate-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>resource-gz</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<inputDirectory>${basedir}/src/main/webapps/static</inputDirectory>
|
||||||
|
<outputDirectory>${basedir}/target/webapps/static</outputDirectory>
|
||||||
|
<extensions>js,css</extensions>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
import org.apache.hadoop.util.Tool;
|
import org.apache.hadoop.util.Tool;
|
||||||
import org.apache.hadoop.util.ToolRunner;
|
import org.apache.hadoop.util.ToolRunner;
|
||||||
import org.apache.htrace.core.Tracer;
|
import org.apache.htrace.core.Tracer;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
@ -212,7 +212,7 @@
|
|||||||
import org.apache.hadoop.util.Time;
|
import org.apache.hadoop.util.Time;
|
||||||
import org.apache.hadoop.util.VersionInfo;
|
import org.apache.hadoop.util.VersionInfo;
|
||||||
import org.apache.htrace.core.Tracer;
|
import org.apache.htrace.core.Tracer;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
|
@ -283,7 +283,7 @@
|
|||||||
import org.apache.log4j.Appender;
|
import org.apache.log4j.Appender;
|
||||||
import org.apache.log4j.AsyncAppender;
|
import org.apache.log4j.AsyncAppender;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
import org.apache.hadoop.io.IOUtils;
|
import org.apache.hadoop.io.IOUtils;
|
||||||
import org.apache.hadoop.net.DNS;
|
import org.apache.hadoop.net.DNS;
|
||||||
import org.apache.hadoop.util.Time;
|
import org.apache.hadoop.util.Time;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import org.mortbay.jetty.EofException;
|
import org.eclipse.jetty.io.EofException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class provides fetching a specified file from the NameNode.
|
* This class provides fetching a specified file from the NameNode.
|
||||||
|
@ -84,6 +84,7 @@
|
|||||||
import org.apache.hadoop.hdfs.web.WebHdfsConstants;
|
import org.apache.hadoop.hdfs.web.WebHdfsConstants;
|
||||||
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;
|
import org.apache.hadoop.hdfs.web.WebHdfsFileSystem;
|
||||||
import org.apache.hadoop.hdfs.web.resources.*;
|
import org.apache.hadoop.hdfs.web.resources.*;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.io.Text;
|
import org.apache.hadoop.io.Text;
|
||||||
import org.apache.hadoop.ipc.ExternalCall;
|
import org.apache.hadoop.ipc.ExternalCall;
|
||||||
import org.apache.hadoop.ipc.RetriableException;
|
import org.apache.hadoop.ipc.RetriableException;
|
||||||
@ -355,7 +356,8 @@ private URI redirectURI(final NameNode namenode,
|
|||||||
@PUT
|
@PUT
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response putRoot(
|
public Response putRoot(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
@ -426,7 +428,8 @@ public Response putRoot(
|
|||||||
@PUT
|
@PUT
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response put(
|
public Response put(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
@ -690,7 +693,8 @@ private Response put(
|
|||||||
@POST
|
@POST
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response postRoot(
|
public Response postRoot(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
@ -720,7 +724,8 @@ public Response postRoot(
|
|||||||
@POST
|
@POST
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Consumes({"*/*"})
|
@Consumes({"*/*"})
|
||||||
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response post(
|
public Response post(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
@ -812,7 +817,8 @@ private Response post(
|
|||||||
/** Handle HTTP GET request for the root. */
|
/** Handle HTTP GET request for the root. */
|
||||||
@GET
|
@GET
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response getRoot(
|
public Response getRoot(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
@ -856,7 +862,8 @@ public Response getRoot(
|
|||||||
/** Handle HTTP GET request. */
|
/** Handle HTTP GET request. */
|
||||||
@GET
|
@GET
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_JSON})
|
@Produces({MediaType.APPLICATION_OCTET_STREAM + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8})
|
||||||
public Response get(
|
public Response get(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
@ -1131,7 +1138,7 @@ public Void run() throws IOException {
|
|||||||
/** Handle HTTP DELETE request for the root. */
|
/** Handle HTTP DELETE request for the root. */
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("/")
|
@Path("/")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response deleteRoot(
|
public Response deleteRoot(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
@ -1154,7 +1161,7 @@ public Response deleteRoot(
|
|||||||
/** Handle HTTP DELETE request. */
|
/** Handle HTTP DELETE request. */
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
@Path("{" + UriFsPathParam.NAME + ":.*}")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8)
|
||||||
public Response delete(
|
public Response delete(
|
||||||
@Context final UserGroupInformation ugi,
|
@Context final UserGroupInformation ugi,
|
||||||
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
@QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT)
|
||||||
|
@ -64,7 +64,7 @@
|
|||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test {@link JournalNodeMXBean}
|
* Test {@link JournalNodeMXBean}
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for testing {@link BlockStatsMXBean} implementation
|
* Class for testing {@link BlockStatsMXBean} implementation
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
import org.codehaus.jackson.type.TypeReference;
|
import org.codehaus.jackson.type.TypeReference;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for testing {@link NameNodeMXBean} implementation
|
* Class for testing {@link NameNodeMXBean} implementation
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
import org.codehaus.jackson.map.ObjectMapper;
|
import org.codehaus.jackson.map.ObjectMapper;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
import javax.management.MBeanServer;
|
import javax.management.MBeanServer;
|
||||||
import javax.management.ObjectName;
|
import javax.management.ObjectName;
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
import org.apache.hadoop.hdfs.server.namenode.startupprogress.StartupProgress;
|
import org.apache.hadoop.hdfs.server.namenode.startupprogress.StartupProgress;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
public class TestStartupProgressServlet {
|
public class TestStartupProgressServlet {
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ public void testClientSideExceptionOnJustOneDir() throws IOException {
|
|||||||
/**
|
/**
|
||||||
* Test to verify the read timeout
|
* Test to verify the read timeout
|
||||||
*/
|
*/
|
||||||
@Test(timeout = 5000)
|
@Test(timeout = 10000)
|
||||||
public void testGetImageTimeout() throws Exception {
|
public void testGetImageTimeout() throws Exception {
|
||||||
HttpServer2 testServer = HttpServerFunctionalTest.createServer("hdfs");
|
HttpServer2 testServer = HttpServerFunctionalTest.createServer("hdfs");
|
||||||
try {
|
try {
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.internal.util.reflection.Whitebox;
|
import org.mockito.internal.util.reflection.Whitebox;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
import org.apache.hadoop.hdfs.HdfsConfiguration;
|
import org.apache.hadoop.hdfs.HdfsConfiguration;
|
||||||
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
import org.apache.hadoop.hdfs.MiniDFSCluster;
|
||||||
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption;
|
import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class drives the creation of a mini-cluster on the local machine. By
|
* This class drives the creation of a mini-cluster on the local machine. By
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
import org.apache.hadoop.mapred.JobContext;
|
import org.apache.hadoop.mapred.JobContext;
|
||||||
import org.apache.hadoop.mapreduce.MRJobConfig;
|
import org.apache.hadoop.mapreduce.MRJobConfig;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobReport;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobReport;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>This class handles job end notification. Submitters of jobs can choose to
|
* <p>This class handles job end notification. Submitters of jobs can choose to
|
||||||
@ -101,11 +101,12 @@ public void setConf(Configuration conf) {
|
|||||||
int port = Integer.parseInt(portConf);
|
int port = Integer.parseInt(portConf);
|
||||||
proxyToUse = new Proxy(proxyType,
|
proxyToUse = new Proxy(proxyType,
|
||||||
new InetSocketAddress(hostname, port));
|
new InetSocketAddress(hostname, port));
|
||||||
Log.info("Job end notification using proxy type \"" + proxyType +
|
Log.getLog().info("Job end notification using proxy type \""
|
||||||
"\" hostname \"" + hostname + "\" and port \"" + port + "\"");
|
+ proxyType + "\" hostname \"" + hostname + "\" and port \"" + port
|
||||||
|
+ "\"");
|
||||||
} catch(NumberFormatException nfe) {
|
} catch(NumberFormatException nfe) {
|
||||||
Log.warn("Job end notification couldn't parse configured proxy's port "
|
Log.getLog().warn("Job end notification couldn't parse configured"
|
||||||
+ portConf + ". Not going to use a proxy");
|
+ "proxy's port " + portConf + ". Not going to use a proxy");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,23 +122,25 @@ public Configuration getConf() {
|
|||||||
protected boolean notifyURLOnce() {
|
protected boolean notifyURLOnce() {
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
try {
|
try {
|
||||||
Log.info("Job end notification trying " + urlToNotify);
|
Log.getLog().info("Job end notification trying " + urlToNotify);
|
||||||
HttpURLConnection conn =
|
HttpURLConnection conn =
|
||||||
(HttpURLConnection) urlToNotify.openConnection(proxyToUse);
|
(HttpURLConnection) urlToNotify.openConnection(proxyToUse);
|
||||||
conn.setConnectTimeout(timeout);
|
conn.setConnectTimeout(timeout);
|
||||||
conn.setReadTimeout(timeout);
|
conn.setReadTimeout(timeout);
|
||||||
conn.setAllowUserInteraction(false);
|
conn.setAllowUserInteraction(false);
|
||||||
if(conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
|
if(conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
|
||||||
Log.warn("Job end notification to " + urlToNotify +" failed with code: "
|
Log.getLog().warn("Job end notification to " + urlToNotify
|
||||||
+ conn.getResponseCode() + " and message \"" + conn.getResponseMessage()
|
+ " failed with code: " + conn.getResponseCode() + " and message \""
|
||||||
+"\"");
|
+ conn.getResponseMessage() + "\"");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
success = true;
|
success = true;
|
||||||
Log.info("Job end notification to " + urlToNotify + " succeeded");
|
Log.getLog().info("Job end notification to " + urlToNotify
|
||||||
|
+ " succeeded");
|
||||||
}
|
}
|
||||||
} catch(IOException ioe) {
|
} catch(IOException ioe) {
|
||||||
Log.warn("Job end notification to " + urlToNotify + " failed", ioe);
|
Log.getLog().warn("Job end notification to " + urlToNotify + " failed",
|
||||||
|
ioe);
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
@ -152,7 +155,7 @@ public void notify(JobReport jobReport)
|
|||||||
throws InterruptedException {
|
throws InterruptedException {
|
||||||
// Do we need job-end notification?
|
// Do we need job-end notification?
|
||||||
if (userUrl == null) {
|
if (userUrl == null) {
|
||||||
Log.info("Job end notification URL not set, skipping.");
|
Log.getLog().info("Job end notification URL not set, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,23 +171,25 @@ public void notify(JobReport jobReport)
|
|||||||
try {
|
try {
|
||||||
urlToNotify = new URL(userUrl);
|
urlToNotify = new URL(userUrl);
|
||||||
} catch (MalformedURLException mue) {
|
} catch (MalformedURLException mue) {
|
||||||
Log.warn("Job end notification couldn't parse " + userUrl, mue);
|
Log.getLog().warn("Job end notification couldn't parse " + userUrl, mue);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send notification
|
// Send notification
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
while (numTries-- > 0 && !success) {
|
while (numTries-- > 0 && !success) {
|
||||||
Log.info("Job end notification attempts left " + numTries);
|
Log.getLog().info("Job end notification attempts left " + numTries);
|
||||||
success = notifyURLOnce();
|
success = notifyURLOnce();
|
||||||
if (!success) {
|
if (!success) {
|
||||||
Thread.sleep(waitInterval);
|
Thread.sleep(waitInterval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!success) {
|
if (!success) {
|
||||||
Log.warn("Job end notification failed to notify : " + urlToNotify);
|
Log.getLog().warn("Job end notification failed to notify : "
|
||||||
|
+ urlToNotify);
|
||||||
} else {
|
} else {
|
||||||
Log.info("Job end notification succeeded for " + jobReport.getJobId());
|
Log.getLog().info("Job end notification succeeded for "
|
||||||
|
+ jobReport.getJobId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import javax.ws.rs.core.Response.Status;
|
import javax.ws.rs.core.Response.Status;
|
||||||
|
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.JobACL;
|
import org.apache.hadoop.mapreduce.JobACL;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.protocolrecords.KillTaskAttemptRequest;
|
import org.apache.hadoop.mapreduce.v2.api.protocolrecords.KillTaskAttemptRequest;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.protocolrecords.KillTaskAttemptResponse;
|
import org.apache.hadoop.mapreduce.v2.api.protocolrecords.KillTaskAttemptResponse;
|
||||||
@ -221,14 +222,16 @@ void checkAccess(Job job, HttpServletRequest request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public AppInfo get() {
|
public AppInfo get() {
|
||||||
return getAppInfo();
|
return getAppInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/info")
|
@Path("/info")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public AppInfo getAppInfo() {
|
public AppInfo getAppInfo() {
|
||||||
init();
|
init();
|
||||||
return new AppInfo(this.app, this.app.context);
|
return new AppInfo(this.app, this.app.context);
|
||||||
@ -236,7 +239,8 @@ public AppInfo getAppInfo() {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/blacklistednodes")
|
@Path("/blacklistednodes")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public BlacklistedNodesInfo getBlacklistedNodes() {
|
public BlacklistedNodesInfo getBlacklistedNodes() {
|
||||||
init();
|
init();
|
||||||
return new BlacklistedNodesInfo(this.app.context);
|
return new BlacklistedNodesInfo(this.app.context);
|
||||||
@ -244,7 +248,8 @@ public BlacklistedNodesInfo getBlacklistedNodes() {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs")
|
@Path("/jobs")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobsInfo getJobs(@Context HttpServletRequest hsr) {
|
public JobsInfo getJobs(@Context HttpServletRequest hsr) {
|
||||||
init();
|
init();
|
||||||
JobsInfo allJobs = new JobsInfo();
|
JobsInfo allJobs = new JobsInfo();
|
||||||
@ -261,7 +266,8 @@ public JobsInfo getJobs(@Context HttpServletRequest hsr) {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}")
|
@Path("/jobs/{jobid}")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobInfo getJob(@Context HttpServletRequest hsr,
|
public JobInfo getJob(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid) {
|
@PathParam("jobid") String jid) {
|
||||||
init();
|
init();
|
||||||
@ -271,7 +277,8 @@ public JobInfo getJob(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/jobattempts")
|
@Path("/jobs/{jobid}/jobattempts")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) {
|
public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) {
|
||||||
init();
|
init();
|
||||||
Job job = getJobFromJobIdString(jid, appCtx);
|
Job job = getJobFromJobIdString(jid, appCtx);
|
||||||
@ -286,7 +293,8 @@ public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/counters")
|
@Path("/jobs/{jobid}/counters")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr,
|
public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid) {
|
@PathParam("jobid") String jid) {
|
||||||
init();
|
init();
|
||||||
@ -297,7 +305,8 @@ public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/conf")
|
@Path("/jobs/{jobid}/conf")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public ConfInfo getJobConf(@Context HttpServletRequest hsr,
|
public ConfInfo getJobConf(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid) {
|
@PathParam("jobid") String jid) {
|
||||||
|
|
||||||
@ -316,7 +325,8 @@ public ConfInfo getJobConf(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/tasks")
|
@Path("/jobs/{jobid}/tasks")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TasksInfo getJobTasks(@Context HttpServletRequest hsr,
|
public TasksInfo getJobTasks(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @QueryParam("type") String type) {
|
@PathParam("jobid") String jid, @QueryParam("type") String type) {
|
||||||
|
|
||||||
@ -343,7 +353,8 @@ public TasksInfo getJobTasks(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/tasks/{taskid}")
|
@Path("/jobs/{jobid}/tasks/{taskid}")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TaskInfo getJobTask(@Context HttpServletRequest hsr,
|
public TaskInfo getJobTask(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
||||||
|
|
||||||
@ -356,7 +367,8 @@ public TaskInfo getJobTask(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/tasks/{taskid}/counters")
|
@Path("/jobs/{jobid}/tasks/{taskid}/counters")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobTaskCounterInfo getSingleTaskCounters(
|
public JobTaskCounterInfo getSingleTaskCounters(
|
||||||
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
||||||
@PathParam("taskid") String tid) {
|
@PathParam("taskid") String tid) {
|
||||||
@ -370,7 +382,8 @@ public JobTaskCounterInfo getSingleTaskCounters(
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/tasks/{taskid}/attempts")
|
@Path("/jobs/{jobid}/tasks/{taskid}/attempts")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr,
|
public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
||||||
|
|
||||||
@ -394,7 +407,8 @@ public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}")
|
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr,
|
public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @PathParam("taskid") String tid,
|
@PathParam("jobid") String jid, @PathParam("taskid") String tid,
|
||||||
@PathParam("attemptid") String attId) {
|
@PathParam("attemptid") String attId) {
|
||||||
@ -413,7 +427,8 @@ public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/state")
|
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/state")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobTaskAttemptState getJobTaskAttemptState(
|
public JobTaskAttemptState getJobTaskAttemptState(
|
||||||
@Context HttpServletRequest hsr,
|
@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @PathParam("taskid") String tid,
|
@PathParam("jobid") String jid, @PathParam("taskid") String tid,
|
||||||
@ -429,7 +444,8 @@ public JobTaskAttemptState getJobTaskAttemptState(
|
|||||||
|
|
||||||
@PUT
|
@PUT
|
||||||
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/state")
|
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/state")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
||||||
public Response updateJobTaskAttemptState(JobTaskAttemptState targetState,
|
public Response updateJobTaskAttemptState(JobTaskAttemptState targetState,
|
||||||
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
||||||
@ -466,7 +482,8 @@ public Response updateJobTaskAttemptState(JobTaskAttemptState targetState,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/counters")
|
@Path("/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/counters")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobTaskAttemptCounterInfo getJobTaskAttemptIdCounters(
|
public JobTaskAttemptCounterInfo getJobTaskAttemptIdCounters(
|
||||||
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
||||||
@PathParam("taskid") String tid, @PathParam("attemptid") String attId) {
|
@PathParam("taskid") String tid, @PathParam("attemptid") String attId) {
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.MockAppContext;
|
import org.apache.hadoop.mapreduce.v2.app.MockAppContext;
|
||||||
import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
|
import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
|
||||||
@ -112,7 +113,8 @@ public void testAM() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyAMInfo(json.getJSONObject("info"), appContext);
|
verifyAMInfo(json.getJSONObject("info"), appContext);
|
||||||
@ -123,7 +125,8 @@ public void testAMSlash() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce/")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyAMInfo(json.getJSONObject("info"), appContext);
|
verifyAMInfo(json.getJSONObject("info"), appContext);
|
||||||
@ -134,7 +137,8 @@ public void testAMDefault() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce/")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce/")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyAMInfo(json.getJSONObject("info"), appContext);
|
verifyAMInfo(json.getJSONObject("info"), appContext);
|
||||||
@ -145,7 +149,8 @@ public void testAMXML() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
verifyAMInfoXML(xml, appContext);
|
verifyAMInfoXML(xml, appContext);
|
||||||
}
|
}
|
||||||
@ -156,7 +161,8 @@ public void testInfo() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("info").accept(MediaType.APPLICATION_JSON)
|
.path("info").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyAMInfo(json.getJSONObject("info"), appContext);
|
verifyAMInfo(json.getJSONObject("info"), appContext);
|
||||||
@ -168,7 +174,8 @@ public void testInfoSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("info/").accept(MediaType.APPLICATION_JSON)
|
.path("info/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyAMInfo(json.getJSONObject("info"), appContext);
|
verifyAMInfo(json.getJSONObject("info"), appContext);
|
||||||
@ -179,7 +186,8 @@ public void testInfoDefault() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("info/").get(ClientResponse.class);
|
.path("info/").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyAMInfo(json.getJSONObject("info"), appContext);
|
verifyAMInfo(json.getJSONObject("info"), appContext);
|
||||||
@ -191,7 +199,8 @@ public void testInfoXML() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("info/").accept(MediaType.APPLICATION_XML)
|
.path("info/").accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
verifyAMInfoXML(xml, appContext);
|
verifyAMInfoXML(xml, appContext);
|
||||||
}
|
}
|
||||||
@ -251,7 +260,8 @@ public void testBlacklistedNodes() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("blacklistednodes").accept(MediaType.APPLICATION_JSON)
|
.path("blacklistednodes").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyBlacklistedNodesInfo(json, appContext);
|
verifyBlacklistedNodesInfo(json, appContext);
|
||||||
@ -263,7 +273,8 @@ public void testBlacklistedNodesXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("blacklistednodes").accept(MediaType.APPLICATION_XML)
|
.path("blacklistednodes").accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
verifyBlacklistedNodesInfoXML(xml, appContext);
|
verifyBlacklistedNodesInfoXML(xml, appContext);
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptState;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptState;
|
||||||
@ -152,7 +153,8 @@ public void testGetTaskAttemptIdState() throws Exception {
|
|||||||
.path("attempts").path(attid).path("state")
|
.path("attempts").path(attid).path("state")
|
||||||
.queryParam("user.name", webserviceUserName)
|
.queryParam("user.name", webserviceUserName)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
assertEquals(att.getState().toString(), json.get("state"));
|
assertEquals(att.getState().toString(), json.get("state"));
|
||||||
@ -180,7 +182,8 @@ public void testGetTaskAttemptIdXMLState() throws Exception {
|
|||||||
.queryParam("user.name", webserviceUserName)
|
.queryParam("user.name", webserviceUserName)
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -219,7 +222,8 @@ public void testPutTaskAttemptIdState() throws Exception {
|
|||||||
.accept(MediaType.APPLICATION_JSON)
|
.accept(MediaType.APPLICATION_JSON)
|
||||||
.type(MediaType.APPLICATION_JSON)
|
.type(MediaType.APPLICATION_JSON)
|
||||||
.put(ClientResponse.class, "{\"state\":\"KILLED\"}");
|
.put(ClientResponse.class, "{\"state\":\"KILLED\"}");
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
assertEquals(TaskAttemptState.KILLED.toString(), json.get("state"));
|
assertEquals(TaskAttemptState.KILLED.toString(), json.get("state"));
|
||||||
@ -252,7 +256,8 @@ public void testPutTaskAttemptIdXMLState() throws Exception {
|
|||||||
.put(ClientResponse.class,
|
.put(ClientResponse.class,
|
||||||
"<jobTaskAttemptState><state>KILLED" +
|
"<jobTaskAttemptState><state>KILLED" +
|
||||||
"</state></jobTaskAttemptState>");
|
"</state></jobTaskAttemptState>");
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
|
||||||
@ -127,7 +128,8 @@ public void testTaskAttempts() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
verifyAMTaskAttempts(json, task);
|
verifyAMTaskAttempts(json, task);
|
||||||
}
|
}
|
||||||
@ -146,7 +148,8 @@ public void testTaskAttemptsSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts/")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
verifyAMTaskAttempts(json, task);
|
verifyAMTaskAttempts(json, task);
|
||||||
}
|
}
|
||||||
@ -165,7 +168,8 @@ public void testTaskAttemptsDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
verifyAMTaskAttempts(json, task);
|
verifyAMTaskAttempts(json, task);
|
||||||
}
|
}
|
||||||
@ -185,7 +189,8 @@ public void testTaskAttemptsXML() throws JSONException, Exception {
|
|||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("attempts")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -220,7 +225,8 @@ public void testTaskAttemptId() throws JSONException, Exception {
|
|||||||
.path("jobs").path(jobId).path("tasks").path(tid)
|
.path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("attempts").path(attid).accept(MediaType.APPLICATION_JSON)
|
.path("attempts").path(attid).accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("taskAttempt");
|
JSONObject info = json.getJSONObject("taskAttempt");
|
||||||
@ -249,7 +255,8 @@ public void testTaskAttemptIdSlash() throws JSONException, Exception {
|
|||||||
.path("jobs").path(jobId).path("tasks").path(tid)
|
.path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("attempts").path(attid + "/")
|
.path("attempts").path(attid + "/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("taskAttempt");
|
JSONObject info = json.getJSONObject("taskAttempt");
|
||||||
@ -277,7 +284,8 @@ public void testTaskAttemptIdDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid)
|
.path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("attempts").path(attid).get(ClientResponse.class);
|
.path("attempts").path(attid).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("taskAttempt");
|
JSONObject info = json.getJSONObject("taskAttempt");
|
||||||
@ -305,7 +313,8 @@ public void testTaskAttemptIdXML() throws JSONException, Exception {
|
|||||||
.path("attempts").path(attid).accept(MediaType.APPLICATION_XML)
|
.path("attempts").path(attid).accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -377,7 +386,8 @@ private void testTaskAttemptIdErrorGeneric(String attid, String error)
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -556,7 +566,8 @@ public void testTaskAttemptIdCounters() throws JSONException, Exception {
|
|||||||
.path("jobs").path(jobId).path("tasks").path(tid)
|
.path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("attempts").path(attid).path("counters")
|
.path("attempts").path(attid).path("counters")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskAttemptCounters");
|
JSONObject info = json.getJSONObject("jobTaskAttemptCounters");
|
||||||
@ -584,7 +595,8 @@ public void testTaskAttemptIdXMLCounters() throws JSONException, Exception {
|
|||||||
.path("attempts").path(attid).path("counters")
|
.path("attempts").path(attid).path("counters")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.FileUtil;
|
import org.apache.hadoop.fs.FileUtil;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.MRJobConfig;
|
import org.apache.hadoop.mapreduce.MRJobConfig;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
||||||
@ -156,7 +157,8 @@ public void testJobConf() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf")
|
.path("jobs").path(jobId).path("conf")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("conf");
|
JSONObject info = json.getJSONObject("conf");
|
||||||
@ -174,7 +176,8 @@ public void testJobConfSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf/")
|
.path("jobs").path(jobId).path("conf/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("conf");
|
JSONObject info = json.getJSONObject("conf");
|
||||||
@ -191,7 +194,8 @@ public void testJobConfDefault() throws JSONException, Exception {
|
|||||||
|
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf").get(ClientResponse.class);
|
.path("jobs").path(jobId).path("conf").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("conf");
|
JSONObject info = json.getJSONObject("conf");
|
||||||
@ -209,7 +213,8 @@ public void testJobConfXML() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf")
|
.path("jobs").path(jobId).path("conf")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.JobACL;
|
import org.apache.hadoop.mapreduce.JobACL;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.AMInfo;
|
import org.apache.hadoop.mapreduce.v2.api.records.AMInfo;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
@ -123,7 +124,8 @@ public void testJobs() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").accept(MediaType.APPLICATION_JSON)
|
.path("jobs").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -140,7 +142,8 @@ public void testJobsSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs/").accept(MediaType.APPLICATION_JSON)
|
.path("jobs/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -156,7 +159,8 @@ public void testJobsDefault() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").get(ClientResponse.class);
|
.path("jobs").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -173,7 +177,8 @@ public void testJobsXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").accept(MediaType.APPLICATION_XML)
|
.path("jobs").accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -198,7 +203,8 @@ public void testJobId() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).accept(MediaType.APPLICATION_JSON)
|
.path("jobs").path(jobId).accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("job");
|
JSONObject info = json.getJSONObject("job");
|
||||||
@ -217,7 +223,8 @@ public void testJobIdSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId + "/").accept(MediaType.APPLICATION_JSON)
|
.path("jobs").path(jobId + "/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("job");
|
JSONObject info = json.getJSONObject("job");
|
||||||
@ -234,7 +241,8 @@ public void testJobIdDefault() throws JSONException, Exception {
|
|||||||
|
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).get(ClientResponse.class);
|
.path("jobs").path(jobId).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("job");
|
JSONObject info = json.getJSONObject("job");
|
||||||
@ -254,7 +262,8 @@ public void testJobIdNonExist() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -281,7 +290,8 @@ public void testJobIdInvalid() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -304,7 +314,8 @@ public void testJobIdInvalidDefault() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -327,7 +338,8 @@ public void testJobIdInvalidXML() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String msg = response.getEntity(String.class);
|
String msg = response.getEntity(String.class);
|
||||||
System.out.println(msg);
|
System.out.println(msg);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
@ -366,7 +378,8 @@ public void testJobIdInvalidBogus() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -395,7 +408,8 @@ public void testJobIdXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).accept(MediaType.APPLICATION_XML)
|
.path("jobs").path(jobId).accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -629,7 +643,8 @@ public void testJobCounters() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("counters")
|
.path("jobs").path(jobId).path("counters")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobCounters");
|
JSONObject info = json.getJSONObject("jobCounters");
|
||||||
@ -647,7 +662,8 @@ public void testJobCountersSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("counters/")
|
.path("jobs").path(jobId).path("counters/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobCounters");
|
JSONObject info = json.getJSONObject("jobCounters");
|
||||||
@ -664,7 +680,8 @@ public void testJobCountersDefault() throws JSONException, Exception {
|
|||||||
|
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("counters/").get(ClientResponse.class);
|
.path("jobs").path(jobId).path("counters/").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobCounters");
|
JSONObject info = json.getJSONObject("jobCounters");
|
||||||
@ -682,7 +699,8 @@ public void testJobCountersXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("counters")
|
.path("jobs").path(jobId).path("counters")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -781,7 +799,8 @@ public void testJobAttempts() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1")
|
ClientResponse response = r.path("ws").path("v1")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobAttempts");
|
JSONObject info = json.getJSONObject("jobAttempts");
|
||||||
@ -799,7 +818,8 @@ public void testJobAttemptsSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1")
|
ClientResponse response = r.path("ws").path("v1")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts/")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobAttempts");
|
JSONObject info = json.getJSONObject("jobAttempts");
|
||||||
@ -817,7 +837,8 @@ public void testJobAttemptsDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1")
|
ClientResponse response = r.path("ws").path("v1")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobAttempts");
|
JSONObject info = json.getJSONObject("jobAttempts");
|
||||||
@ -835,7 +856,8 @@ public void testJobAttemptsXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1")
|
ClientResponse response = r.path("ws").path("v1")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.TaskID;
|
import org.apache.hadoop.mapreduce.TaskID;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskId;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskId;
|
||||||
@ -122,7 +123,8 @@ public void testTasks() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks")
|
.path("jobs").path(jobId).path("tasks")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -141,7 +143,8 @@ public void testTasksDefault() throws JSONException, Exception {
|
|||||||
String jobId = MRApps.toString(id);
|
String jobId = MRApps.toString(id);
|
||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").get(ClientResponse.class);
|
.path("jobs").path(jobId).path("tasks").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -161,7 +164,8 @@ public void testTasksSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks/")
|
.path("jobs").path(jobId).path("tasks/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -182,7 +186,8 @@ public void testTasksXML() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks")
|
.path("jobs").path(jobId).path("tasks")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -206,7 +211,8 @@ public void testTasksQueryMap() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").queryParam("type", type)
|
.path("jobs").path(jobId).path("tasks").queryParam("type", type)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -226,7 +232,8 @@ public void testTasksQueryReduce() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").queryParam("type", type)
|
.path("jobs").path(jobId).path("tasks").queryParam("type", type)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -253,7 +260,8 @@ public void testTasksQueryInvalid() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -282,7 +290,8 @@ public void testTaskId() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid)
|
.path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("task");
|
JSONObject info = json.getJSONObject("task");
|
||||||
@ -303,7 +312,8 @@ public void testTaskIdSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid + "/")
|
.path("jobs").path(jobId).path("tasks").path(tid + "/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("task");
|
JSONObject info = json.getJSONObject("task");
|
||||||
@ -324,7 +334,8 @@ public void testTaskIdDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid)
|
.path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("task");
|
JSONObject info = json.getJSONObject("task");
|
||||||
@ -347,7 +358,8 @@ public void testTaskIdBogus() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -381,7 +393,8 @@ public void testTaskIdNonExist() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -413,7 +426,8 @@ public void testTaskIdInvalid() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -447,7 +461,8 @@ public void testTaskIdInvalid2() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -481,7 +496,8 @@ public void testTaskIdInvalid3() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -514,7 +530,8 @@ public void testTaskIdXML() throws JSONException, Exception {
|
|||||||
.path("jobs").path(jobId).path("tasks").path(tid)
|
.path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -627,7 +644,8 @@ public void testTaskIdCounters() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("counters")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("counters")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskCounters");
|
JSONObject info = json.getJSONObject("jobTaskCounters");
|
||||||
@ -648,7 +666,8 @@ public void testTaskIdCountersSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("counters/")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("counters/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskCounters");
|
JSONObject info = json.getJSONObject("jobTaskCounters");
|
||||||
@ -669,7 +688,8 @@ public void testTaskIdCountersDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("counters")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("counters")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskCounters");
|
JSONObject info = json.getJSONObject("jobTaskCounters");
|
||||||
@ -690,7 +710,8 @@ public void testJobTaskCountersXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("tasks").path(tid).path("counters")
|
.path("jobs").path(jobId).path("tasks").path(tid).path("counters")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
import javax.ws.rs.core.UriInfo;
|
import javax.ws.rs.core.UriInfo;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.JobACL;
|
import org.apache.hadoop.mapreduce.JobACL;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.AMInfo;
|
import org.apache.hadoop.mapreduce.v2.api.records.AMInfo;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobState;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobState;
|
||||||
@ -110,14 +111,16 @@ void setResponse(HttpServletResponse response) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public HistoryInfo get() {
|
public HistoryInfo get() {
|
||||||
return getHistoryInfo();
|
return getHistoryInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/info")
|
@Path("/info")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public HistoryInfo getHistoryInfo() {
|
public HistoryInfo getHistoryInfo() {
|
||||||
init();
|
init();
|
||||||
return new HistoryInfo();
|
return new HistoryInfo();
|
||||||
@ -125,7 +128,8 @@ public HistoryInfo getHistoryInfo() {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs")
|
@Path("/mapreduce/jobs")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobsInfo getJobs(@QueryParam("user") String userQuery,
|
public JobsInfo getJobs(@QueryParam("user") String userQuery,
|
||||||
@QueryParam("limit") String count,
|
@QueryParam("limit") String count,
|
||||||
@QueryParam("state") String stateQuery,
|
@QueryParam("state") String stateQuery,
|
||||||
@ -215,7 +219,8 @@ public JobsInfo getJobs(@QueryParam("user") String userQuery,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}")
|
@Path("/mapreduce/jobs/{jobid}")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobInfo getJob(@Context HttpServletRequest hsr,
|
public JobInfo getJob(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid) {
|
@PathParam("jobid") String jid) {
|
||||||
|
|
||||||
@ -227,7 +232,8 @@ public JobInfo getJob(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/jobattempts")
|
@Path("/mapreduce/jobs/{jobid}/jobattempts")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) {
|
public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) {
|
||||||
|
|
||||||
init();
|
init();
|
||||||
@ -244,7 +250,8 @@ public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/counters")
|
@Path("/mapreduce/jobs/{jobid}/counters")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr,
|
public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid) {
|
@PathParam("jobid") String jid) {
|
||||||
|
|
||||||
@ -256,7 +263,8 @@ public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/conf")
|
@Path("/mapreduce/jobs/{jobid}/conf")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public ConfInfo getJobConf(@Context HttpServletRequest hsr,
|
public ConfInfo getJobConf(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid) {
|
@PathParam("jobid") String jid) {
|
||||||
|
|
||||||
@ -275,7 +283,8 @@ public ConfInfo getJobConf(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/tasks")
|
@Path("/mapreduce/jobs/{jobid}/tasks")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TasksInfo getJobTasks(@Context HttpServletRequest hsr,
|
public TasksInfo getJobTasks(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @QueryParam("type") String type) {
|
@PathParam("jobid") String jid, @QueryParam("type") String type) {
|
||||||
|
|
||||||
@ -302,7 +311,8 @@ public TasksInfo getJobTasks(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}")
|
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TaskInfo getJobTask(@Context HttpServletRequest hsr,
|
public TaskInfo getJobTask(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
||||||
|
|
||||||
@ -316,7 +326,8 @@ public TaskInfo getJobTask(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/counters")
|
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/counters")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobTaskCounterInfo getSingleTaskCounters(
|
public JobTaskCounterInfo getSingleTaskCounters(
|
||||||
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
||||||
@PathParam("taskid") String tid) {
|
@PathParam("taskid") String tid) {
|
||||||
@ -337,7 +348,8 @@ public JobTaskCounterInfo getSingleTaskCounters(
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts")
|
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr,
|
public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
@PathParam("jobid") String jid, @PathParam("taskid") String tid) {
|
||||||
|
|
||||||
@ -360,7 +372,8 @@ public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}")
|
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr,
|
public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr,
|
||||||
@PathParam("jobid") String jid, @PathParam("taskid") String tid,
|
@PathParam("jobid") String jid, @PathParam("taskid") String tid,
|
||||||
@PathParam("attemptid") String attId) {
|
@PathParam("attemptid") String attId) {
|
||||||
@ -380,7 +393,8 @@ public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr,
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/counters")
|
@Path("/mapreduce/jobs/{jobid}/tasks/{taskid}/attempts/{attemptid}/counters")
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public JobTaskAttemptCounterInfo getJobTaskAttemptIdCounters(
|
public JobTaskAttemptCounterInfo getJobTaskAttemptIdCounters(
|
||||||
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
@Context HttpServletRequest hsr, @PathParam("jobid") String jid,
|
||||||
@PathParam("taskid") String tid, @PathParam("attemptid") String attId) {
|
@PathParam("taskid") String tid, @PathParam("attemptid") String attId) {
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
||||||
import org.apache.hadoop.mapreduce.v2.hs.HistoryContext;
|
import org.apache.hadoop.mapreduce.v2.hs.HistoryContext;
|
||||||
import org.apache.hadoop.mapreduce.v2.hs.JobHistory;
|
import org.apache.hadoop.mapreduce.v2.hs.JobHistory;
|
||||||
@ -116,7 +117,8 @@ public void testHS() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
||||||
@ -127,7 +129,8 @@ public void testHSSlash() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history/")
|
ClientResponse response = r.path("ws").path("v1").path("history/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
||||||
@ -138,7 +141,8 @@ public void testHSDefault() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history/")
|
ClientResponse response = r.path("ws").path("v1").path("history/")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
||||||
@ -149,7 +153,8 @@ public void testHSXML() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
verifyHSInfoXML(xml, appContext);
|
verifyHSInfoXML(xml, appContext);
|
||||||
}
|
}
|
||||||
@ -160,7 +165,8 @@ public void testInfo() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("info").accept(MediaType.APPLICATION_JSON)
|
.path("info").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
||||||
@ -172,7 +178,8 @@ public void testInfoSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("info/").accept(MediaType.APPLICATION_JSON)
|
.path("info/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
||||||
@ -183,7 +190,8 @@ public void testInfoDefault() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("info/").get(ClientResponse.class);
|
.path("info/").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
verifyHSInfo(json.getJSONObject("historyInfo"), appContext);
|
||||||
@ -195,7 +203,8 @@ public void testInfoXML() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("info/").accept(MediaType.APPLICATION_XML)
|
.path("info/").accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
verifyHSInfoXML(xml, appContext);
|
verifyHSInfoXML(xml, appContext);
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
|
||||||
@ -137,7 +138,8 @@ public void testTaskAttempts() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("attempts").accept(MediaType.APPLICATION_JSON)
|
.path("attempts").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
verifyHsTaskAttempts(json, task);
|
verifyHsTaskAttempts(json, task);
|
||||||
}
|
}
|
||||||
@ -157,7 +159,8 @@ public void testTaskAttemptsSlash() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("attempts/").accept(MediaType.APPLICATION_JSON)
|
.path("attempts/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
verifyHsTaskAttempts(json, task);
|
verifyHsTaskAttempts(json, task);
|
||||||
}
|
}
|
||||||
@ -176,7 +179,8 @@ public void testTaskAttemptsDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("attempts").get(ClientResponse.class);
|
.path("attempts").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
verifyHsTaskAttempts(json, task);
|
verifyHsTaskAttempts(json, task);
|
||||||
}
|
}
|
||||||
@ -197,7 +201,8 @@ public void testTaskAttemptsXML() throws JSONException, Exception {
|
|||||||
.path("attempts").accept(MediaType.APPLICATION_XML)
|
.path("attempts").accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -232,7 +237,8 @@ public void testTaskAttemptId() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.path(tid).path("attempts").path(attid)
|
.path(tid).path("attempts").path(attid)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("taskAttempt");
|
JSONObject info = json.getJSONObject("taskAttempt");
|
||||||
@ -261,7 +267,8 @@ public void testTaskAttemptIdSlash() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.path(tid).path("attempts").path(attid + "/")
|
.path(tid).path("attempts").path(attid + "/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("taskAttempt");
|
JSONObject info = json.getJSONObject("taskAttempt");
|
||||||
@ -289,7 +296,8 @@ public void testTaskAttemptIdDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.path(tid).path("attempts").path(attid).get(ClientResponse.class);
|
.path(tid).path("attempts").path(attid).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("taskAttempt");
|
JSONObject info = json.getJSONObject("taskAttempt");
|
||||||
@ -317,7 +325,8 @@ public void testTaskAttemptIdXML() throws JSONException, Exception {
|
|||||||
.path(tid).path("attempts").path(attid)
|
.path(tid).path("attempts").path(attid)
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -394,7 +403,8 @@ private void testTaskAttemptIdErrorGeneric(String attid, String error)
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -573,7 +583,8 @@ public void testTaskAttemptIdCounters() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.path(tid).path("attempts").path(attid).path("counters")
|
.path(tid).path("attempts").path(attid).path("counters")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; "
|
||||||
|
+ JettyUtils.UTF_8, response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskAttemptCounters");
|
JSONObject info = json.getJSONObject("jobTaskAttemptCounters");
|
||||||
@ -601,7 +612,8 @@ public void testTaskAttemptIdXMLCounters() throws JSONException, Exception {
|
|||||||
.path(tid).path("attempts").path(attid).path("counters")
|
.path(tid).path("attempts").path(attid).path("counters")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.FileUtil;
|
import org.apache.hadoop.fs.FileUtil;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.MRJobConfig;
|
import org.apache.hadoop.mapreduce.MRJobConfig;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
||||||
@ -167,7 +168,8 @@ public void testJobConf() throws JSONException, Exception {
|
|||||||
.path("mapreduce")
|
.path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf")
|
.path("jobs").path(jobId).path("conf")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("conf");
|
JSONObject info = json.getJSONObject("conf");
|
||||||
@ -185,7 +187,8 @@ public void testJobConfSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("history").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf/")
|
.path("jobs").path(jobId).path("conf/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("conf");
|
JSONObject info = json.getJSONObject("conf");
|
||||||
@ -202,7 +205,8 @@ public void testJobConfDefault() throws JSONException, Exception {
|
|||||||
|
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("history").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf").get(ClientResponse.class);
|
.path("jobs").path(jobId).path("conf").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("conf");
|
JSONObject info = json.getJSONObject("conf");
|
||||||
@ -220,7 +224,8 @@ public void testJobConfXML() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history").path("mapreduce")
|
ClientResponse response = r.path("ws").path("v1").path("history").path("mapreduce")
|
||||||
.path("jobs").path(jobId).path("conf")
|
.path("jobs").path(jobId).path("conf")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.AMInfo;
|
import org.apache.hadoop.mapreduce.v2.api.records.AMInfo;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
||||||
@ -127,7 +128,8 @@ public void testJobs() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").accept(MediaType.APPLICATION_JSON)
|
.path("mapreduce").path("jobs").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -145,7 +147,8 @@ public void testJobsSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs/").accept(MediaType.APPLICATION_JSON)
|
.path("mapreduce").path("jobs/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -162,7 +165,8 @@ public void testJobsDefault() throws JSONException, Exception {
|
|||||||
WebResource r = resource();
|
WebResource r = resource();
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").get(ClientResponse.class);
|
.path("mapreduce").path("jobs").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -180,7 +184,8 @@ public void testJobsXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").accept(MediaType.APPLICATION_XML)
|
.path("mapreduce").path("jobs").accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -271,7 +276,8 @@ public void testJobId() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId)
|
.path("mapreduce").path("jobs").path(jobId)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("job");
|
JSONObject info = json.getJSONObject("job");
|
||||||
@ -290,7 +296,8 @@ public void testJobIdSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId + "/")
|
.path("mapreduce").path("jobs").path(jobId + "/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("job");
|
JSONObject info = json.getJSONObject("job");
|
||||||
@ -308,7 +315,8 @@ public void testJobIdDefault() throws JSONException, Exception {
|
|||||||
|
|
||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).get(ClientResponse.class);
|
.path("mapreduce").path("jobs").path(jobId).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("job");
|
JSONObject info = json.getJSONObject("job");
|
||||||
@ -328,7 +336,8 @@ public void testJobIdNonExist() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -356,7 +365,8 @@ public void testJobIdInvalid() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -380,7 +390,8 @@ public void testJobIdInvalidDefault() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -404,7 +415,8 @@ public void testJobIdInvalidXML() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String msg = response.getEntity(String.class);
|
String msg = response.getEntity(String.class);
|
||||||
System.out.println(msg);
|
System.out.println(msg);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
@ -443,7 +455,8 @@ public void testJobIdInvalidBogus() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -470,7 +483,8 @@ public void testJobIdXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId)
|
.path("mapreduce").path("jobs").path(jobId)
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -493,7 +507,8 @@ public void testJobCounters() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("counters")
|
.path("mapreduce").path("jobs").path(jobId).path("counters")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobCounters");
|
JSONObject info = json.getJSONObject("jobCounters");
|
||||||
@ -511,7 +526,8 @@ public void testJobCountersSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("counters/")
|
.path("mapreduce").path("jobs").path(jobId).path("counters/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobCounters");
|
JSONObject info = json.getJSONObject("jobCounters");
|
||||||
@ -549,7 +565,8 @@ protected void configureServlets() {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("counters/")
|
.path("mapreduce").path("jobs").path(jobId).path("counters/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobCounters");
|
JSONObject info = json.getJSONObject("jobCounters");
|
||||||
@ -569,7 +586,8 @@ public void testJobCountersDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("counters/")
|
.path("mapreduce").path("jobs").path(jobId).path("counters/")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobCounters");
|
JSONObject info = json.getJSONObject("jobCounters");
|
||||||
@ -587,7 +605,8 @@ public void testJobCountersXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("counters")
|
.path("mapreduce").path("jobs").path(jobId).path("counters")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -686,7 +705,8 @@ public void testJobAttempts() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobAttempts");
|
JSONObject info = json.getJSONObject("jobAttempts");
|
||||||
@ -704,7 +724,8 @@ public void testJobAttemptsSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts/")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobAttempts");
|
JSONObject info = json.getJSONObject("jobAttempts");
|
||||||
@ -722,7 +743,8 @@ public void testJobAttemptsDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobAttempts");
|
JSONObject info = json.getJSONObject("jobAttempts");
|
||||||
@ -740,7 +762,8 @@ public void testJobAttemptsXML() throws Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
.path("mapreduce").path("jobs").path(jobId).path("jobattempts")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobState;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobState;
|
||||||
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
import org.apache.hadoop.mapreduce.v2.app.AppContext;
|
||||||
@ -130,7 +131,8 @@ public void testJobsQueryStateNone() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").queryParam("state", notInUse.toString())
|
.path("mapreduce").path("jobs").queryParam("state", notInUse.toString())
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
assertEquals("jobs is not empty",
|
assertEquals("jobs is not empty",
|
||||||
@ -152,7 +154,8 @@ public void testJobsQueryState() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").queryParam("state", queryState)
|
.path("mapreduce").path("jobs").queryParam("state", queryState)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -172,7 +175,8 @@ public void testJobsQueryStateInvalid() throws JSONException, Exception {
|
|||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
|
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -197,7 +201,8 @@ public void testJobsQueryUserNone() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").queryParam("user", "bogus")
|
.path("mapreduce").path("jobs").queryParam("user", "bogus")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
assertEquals("jobs is not empty",
|
assertEquals("jobs is not empty",
|
||||||
@ -210,7 +215,8 @@ public void testJobsQueryUser() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").queryParam("user", "mock")
|
.path("mapreduce").path("jobs").queryParam("user", "mock")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
System.out.println(json.toString());
|
System.out.println(json.toString());
|
||||||
|
|
||||||
@ -230,7 +236,8 @@ public void testJobsQueryLimit() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").queryParam("limit", "2")
|
.path("mapreduce").path("jobs").queryParam("limit", "2")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -248,7 +255,8 @@ public void testJobsQueryLimitInvalid() throws JSONException, Exception {
|
|||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
|
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -269,7 +277,8 @@ public void testJobsQueryQueue() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").queryParam("queue", "mockqueue")
|
.path("mapreduce").path("jobs").queryParam("queue", "mockqueue")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -283,7 +292,8 @@ public void testJobsQueryQueueNonExist() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").queryParam("queue", "bogus")
|
.path("mapreduce").path("jobs").queryParam("queue", "bogus")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
assertEquals("jobs is not empty",
|
assertEquals("jobs is not empty",
|
||||||
@ -299,7 +309,8 @@ public void testJobsQueryStartTimeEnd() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs")
|
.path("mapreduce").path("jobs")
|
||||||
.queryParam("startedTimeEnd", String.valueOf(now))
|
.queryParam("startedTimeEnd", String.valueOf(now))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -316,7 +327,8 @@ public void testJobsQueryStartTimeBegin() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs")
|
.path("mapreduce").path("jobs")
|
||||||
.queryParam("startedTimeBegin", String.valueOf(now))
|
.queryParam("startedTimeBegin", String.valueOf(now))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
assertEquals("jobs is not empty",
|
assertEquals("jobs is not empty",
|
||||||
@ -343,7 +355,8 @@ public void testJobsQueryStartTimeBeginEnd() throws JSONException, Exception {
|
|||||||
.queryParam("startedTimeBegin", String.valueOf(40000))
|
.queryParam("startedTimeBegin", String.valueOf(40000))
|
||||||
.queryParam("startedTimeEnd", String.valueOf(midStartTime))
|
.queryParam("startedTimeEnd", String.valueOf(midStartTime))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -362,7 +375,8 @@ public void testJobsQueryStartTimeBeginEndInvalid() throws JSONException,
|
|||||||
.queryParam("startedTimeEnd", String.valueOf(40000))
|
.queryParam("startedTimeEnd", String.valueOf(40000))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -388,7 +402,8 @@ public void testJobsQueryStartTimeInvalidformat() throws JSONException,
|
|||||||
.path("mapreduce").path("jobs").queryParam("startedTimeBegin", "efsd")
|
.path("mapreduce").path("jobs").queryParam("startedTimeBegin", "efsd")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -414,7 +429,8 @@ public void testJobsQueryStartTimeEndInvalidformat() throws JSONException,
|
|||||||
.path("mapreduce").path("jobs").queryParam("startedTimeEnd", "efsd")
|
.path("mapreduce").path("jobs").queryParam("startedTimeEnd", "efsd")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -440,7 +456,8 @@ public void testJobsQueryStartTimeNegative() throws JSONException, Exception {
|
|||||||
.queryParam("startedTimeBegin", String.valueOf(-1000))
|
.queryParam("startedTimeBegin", String.valueOf(-1000))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -466,7 +483,8 @@ public void testJobsQueryStartTimeEndNegative() throws JSONException,
|
|||||||
.queryParam("startedTimeEnd", String.valueOf(-1000))
|
.queryParam("startedTimeEnd", String.valueOf(-1000))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -490,7 +508,8 @@ public void testJobsQueryFinishTimeEndNegative() throws JSONException,
|
|||||||
.queryParam("finishedTimeEnd", String.valueOf(-1000))
|
.queryParam("finishedTimeEnd", String.valueOf(-1000))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -514,7 +533,8 @@ public void testJobsQueryFinishTimeBeginNegative() throws JSONException,
|
|||||||
.queryParam("finishedTimeBegin", String.valueOf(-1000))
|
.queryParam("finishedTimeBegin", String.valueOf(-1000))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -541,7 +561,8 @@ public void testJobsQueryFinishTimeBeginEndInvalid() throws JSONException,
|
|||||||
.queryParam("finishedTimeEnd", String.valueOf(40000))
|
.queryParam("finishedTimeEnd", String.valueOf(40000))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -567,7 +588,8 @@ public void testJobsQueryFinishTimeInvalidformat() throws JSONException,
|
|||||||
.path("mapreduce").path("jobs").queryParam("finishedTimeBegin", "efsd")
|
.path("mapreduce").path("jobs").queryParam("finishedTimeBegin", "efsd")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -593,7 +615,8 @@ public void testJobsQueryFinishTimeEndInvalidformat() throws JSONException,
|
|||||||
.path("mapreduce").path("jobs").queryParam("finishedTimeEnd", "efsd")
|
.path("mapreduce").path("jobs").queryParam("finishedTimeEnd", "efsd")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -620,7 +643,8 @@ public void testJobsQueryFinishTimeBegin() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs")
|
.path("mapreduce").path("jobs")
|
||||||
.queryParam("finishedTimeBegin", String.valueOf(now))
|
.queryParam("finishedTimeBegin", String.valueOf(now))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
@ -637,7 +661,8 @@ public void testJobsQueryFinishTimeEnd() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs")
|
.path("mapreduce").path("jobs")
|
||||||
.queryParam("finishedTimeEnd", String.valueOf(now))
|
.queryParam("finishedTimeEnd", String.valueOf(now))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
assertEquals("jobs is not empty",
|
assertEquals("jobs is not empty",
|
||||||
@ -665,7 +690,8 @@ public void testJobsQueryFinishTimeBeginEnd() throws JSONException, Exception {
|
|||||||
.queryParam("finishedTimeBegin", String.valueOf(40000))
|
.queryParam("finishedTimeBegin", String.valueOf(40000))
|
||||||
.queryParam("finishedTimeEnd", String.valueOf(midFinishTime))
|
.queryParam("finishedTimeEnd", String.valueOf(midFinishTime))
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject jobs = json.getJSONObject("jobs");
|
JSONObject jobs = json.getJSONObject("jobs");
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
import org.apache.hadoop.mapreduce.TaskID;
|
import org.apache.hadoop.mapreduce.TaskID;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
import org.apache.hadoop.mapreduce.v2.api.records.JobId;
|
||||||
import org.apache.hadoop.mapreduce.v2.api.records.TaskId;
|
import org.apache.hadoop.mapreduce.v2.api.records.TaskId;
|
||||||
@ -131,7 +132,8 @@ public void testTasks() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -151,7 +153,8 @@ public void testTasksDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -171,7 +174,8 @@ public void testTasksSlash() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks/")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks/")
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -192,7 +196,8 @@ public void testTasksXML() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -217,7 +222,8 @@ public void testTasksQueryMap() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.queryParam("type", type).accept(MediaType.APPLICATION_JSON)
|
.queryParam("type", type).accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -238,7 +244,8 @@ public void testTasksQueryReduce() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.queryParam("type", type).accept(MediaType.APPLICATION_JSON)
|
.queryParam("type", type).accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject tasks = json.getJSONObject("tasks");
|
JSONObject tasks = json.getJSONObject("tasks");
|
||||||
@ -265,7 +272,8 @@ public void testTasksQueryInvalid() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
assertResponseStatusCode(Status.BAD_REQUEST, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -294,7 +302,8 @@ public void testTaskId() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("task");
|
JSONObject info = json.getJSONObject("task");
|
||||||
@ -316,7 +325,8 @@ public void testTaskIdSlash() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
.path("mapreduce").path("jobs").path(jobId).path("tasks")
|
||||||
.path(tid + "/").accept(MediaType.APPLICATION_JSON)
|
.path(tid + "/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("task");
|
JSONObject info = json.getJSONObject("task");
|
||||||
@ -337,7 +347,8 @@ public void testTaskIdDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("task");
|
JSONObject info = json.getJSONObject("task");
|
||||||
@ -360,7 +371,8 @@ public void testTaskIdBogus() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -394,7 +406,8 @@ public void testTaskIdNonExist() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -426,7 +439,8 @@ public void testTaskIdInvalid() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -460,7 +474,8 @@ public void testTaskIdInvalid2() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -494,7 +509,8 @@ public void testTaskIdInvalid3() throws JSONException, Exception {
|
|||||||
} catch (UniformInterfaceException ue) {
|
} catch (UniformInterfaceException ue) {
|
||||||
ClientResponse response = ue.getResponse();
|
ClientResponse response = ue.getResponse();
|
||||||
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
assertResponseStatusCode(Status.NOT_FOUND, response.getStatusInfo());
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject msg = response.getEntity(JSONObject.class);
|
JSONObject msg = response.getEntity(JSONObject.class);
|
||||||
JSONObject exception = msg.getJSONObject("RemoteException");
|
JSONObject exception = msg.getJSONObject("RemoteException");
|
||||||
assertEquals("incorrect number of elements", 3, exception.length());
|
assertEquals("incorrect number of elements", 3, exception.length());
|
||||||
@ -527,7 +543,8 @@ public void testTaskIdXML() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
.accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
|
||||||
|
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
@ -638,7 +655,8 @@ public void testTaskIdCounters() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("counters").accept(MediaType.APPLICATION_JSON)
|
.path("counters").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskCounters");
|
JSONObject info = json.getJSONObject("jobTaskCounters");
|
||||||
@ -660,7 +678,8 @@ public void testTaskIdCountersSlash() throws JSONException, Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("counters/").accept(MediaType.APPLICATION_JSON)
|
.path("counters/").accept(MediaType.APPLICATION_JSON)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskCounters");
|
JSONObject info = json.getJSONObject("jobTaskCounters");
|
||||||
@ -681,7 +700,8 @@ public void testTaskIdCountersDefault() throws JSONException, Exception {
|
|||||||
ClientResponse response = r.path("ws").path("v1").path("history")
|
ClientResponse response = r.path("ws").path("v1").path("history")
|
||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("counters").get(ClientResponse.class);
|
.path("counters").get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_JSON_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
JSONObject json = response.getEntity(JSONObject.class);
|
JSONObject json = response.getEntity(JSONObject.class);
|
||||||
assertEquals("incorrect number of elements", 1, json.length());
|
assertEquals("incorrect number of elements", 1, json.length());
|
||||||
JSONObject info = json.getJSONObject("jobTaskCounters");
|
JSONObject info = json.getJSONObject("jobTaskCounters");
|
||||||
@ -703,7 +723,8 @@ public void testJobTaskCountersXML() throws Exception {
|
|||||||
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
.path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid)
|
||||||
.path("counters").accept(MediaType.APPLICATION_XML)
|
.path("counters").accept(MediaType.APPLICATION_XML)
|
||||||
.get(ClientResponse.class);
|
.get(ClientResponse.class);
|
||||||
assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
|
assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8,
|
||||||
|
response.getType().toString());
|
||||||
String xml = response.getEntity(String.class);
|
String xml = response.getEntity(String.class);
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
@ -18,9 +18,10 @@
|
|||||||
|
|
||||||
package org.apache.hadoop.mapred;
|
package org.apache.hadoop.mapred;
|
||||||
|
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.servlet.Context;
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
import org.mortbay.jetty.servlet.ServletHolder;
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.io.Text;
|
import org.apache.hadoop.io.Text;
|
||||||
@ -76,7 +77,8 @@ private void startHttpServer() throws Exception {
|
|||||||
}
|
}
|
||||||
webServer = new Server(0);
|
webServer = new Server(0);
|
||||||
|
|
||||||
Context context = new Context(webServer, contextPath);
|
ServletContextHandler context =
|
||||||
|
new ServletContextHandler(webServer, contextPath);
|
||||||
|
|
||||||
// create servlet handler
|
// create servlet handler
|
||||||
context.addServlet(new ServletHolder(new NotificationServlet()),
|
context.addServlet(new ServletHolder(new NotificationServlet()),
|
||||||
@ -84,7 +86,7 @@ private void startHttpServer() throws Exception {
|
|||||||
|
|
||||||
// Start webServer
|
// Start webServer
|
||||||
webServer.start();
|
webServer.start();
|
||||||
port = webServer.getConnectors()[0].getLocalPort();
|
port = ((ServerConnector)webServer.getConnectors()[0]).getLocalPort();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
import org.apache.hadoop.mapreduce.v2.jobhistory.JHAdminConfig;
|
import org.apache.hadoop.mapreduce.v2.jobhistory.JHAdminConfig;
|
||||||
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
||||||
import org.apache.hadoop.yarn.server.MiniYARNCluster;
|
import org.apache.hadoop.yarn.server.MiniYARNCluster;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class drives the creation of a mini-cluster on the local machine. By
|
* This class drives the creation of a mini-cluster on the local machine. By
|
||||||
|
@ -127,7 +127,7 @@
|
|||||||
import org.jboss.netty.handler.ssl.SslHandler;
|
import org.jboss.netty.handler.ssl.SslHandler;
|
||||||
import org.jboss.netty.handler.stream.ChunkedWriteHandler;
|
import org.jboss.netty.handler.stream.ChunkedWriteHandler;
|
||||||
import org.jboss.netty.util.CharsetUtil;
|
import org.jboss.netty.util.CharsetUtil;
|
||||||
import org.mortbay.jetty.HttpHeaders;
|
import org.eclipse.jetty.http.HttpHeader;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
@ -1137,13 +1137,15 @@ protected void setResponseHeaders(HttpResponse response,
|
|||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Setting connection close header...");
|
LOG.debug("Setting connection close header...");
|
||||||
}
|
}
|
||||||
response.headers().set(HttpHeaders.CONNECTION, CONNECTION_CLOSE);
|
response.headers().set(HttpHeader.CONNECTION.asString(),
|
||||||
|
CONNECTION_CLOSE);
|
||||||
} else {
|
} else {
|
||||||
response.headers().set(HttpHeaders.CONTENT_LENGTH,
|
response.headers().set(HttpHeader.CONTENT_LENGTH.asString(),
|
||||||
String.valueOf(contentLength));
|
String.valueOf(contentLength));
|
||||||
response.headers().set(HttpHeaders.CONNECTION, HttpHeaders.KEEP_ALIVE);
|
response.headers().set(HttpHeader.CONNECTION.asString(),
|
||||||
response.headers().set(HttpHeaders.KEEP_ALIVE, "timeout="
|
HttpHeader.KEEP_ALIVE.asString());
|
||||||
+ connectionKeepAliveTimeOut);
|
response.headers().set(HttpHeader.KEEP_ALIVE.asString(),
|
||||||
|
"timeout=" + connectionKeepAliveTimeOut);
|
||||||
LOG.info("Content Length in shuffle : " + contentLength);
|
LOG.info("Content Length in shuffle : " + contentLength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@
|
|||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
import org.mortbay.jetty.HttpHeaders;
|
import org.eclipse.jetty.http.HttpHeader;
|
||||||
|
|
||||||
public class TestShuffleHandler {
|
public class TestShuffleHandler {
|
||||||
static final long MiB = 1024 * 1024;
|
static final long MiB = 1024 * 1024;
|
||||||
@ -299,7 +299,8 @@ protected void sendError(ChannelHandlerContext ctx, String message,
|
|||||||
conn.connect();
|
conn.connect();
|
||||||
DataInputStream input = new DataInputStream(conn.getInputStream());
|
DataInputStream input = new DataInputStream(conn.getInputStream());
|
||||||
Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
|
Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
|
||||||
Assert.assertEquals("close", conn.getHeaderField(HttpHeaders.CONNECTION));
|
Assert.assertEquals("close",
|
||||||
|
conn.getHeaderField(HttpHeader.CONNECTION.asString()));
|
||||||
ShuffleHeader header = new ShuffleHeader();
|
ShuffleHeader header = new ShuffleHeader();
|
||||||
header.readFields(input);
|
header.readFields(input);
|
||||||
input.close();
|
input.close();
|
||||||
@ -414,10 +415,10 @@ protected void sendError(ChannelHandlerContext ctx, String message,
|
|||||||
ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION);
|
ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION);
|
||||||
conn.connect();
|
conn.connect();
|
||||||
DataInputStream input = new DataInputStream(conn.getInputStream());
|
DataInputStream input = new DataInputStream(conn.getInputStream());
|
||||||
Assert.assertEquals(HttpHeaders.KEEP_ALIVE,
|
Assert.assertEquals(HttpHeader.KEEP_ALIVE.asString(),
|
||||||
conn.getHeaderField(HttpHeaders.CONNECTION));
|
conn.getHeaderField(HttpHeader.CONNECTION.asString()));
|
||||||
Assert.assertEquals("timeout=1",
|
Assert.assertEquals("timeout=1",
|
||||||
conn.getHeaderField(HttpHeaders.KEEP_ALIVE));
|
conn.getHeaderField(HttpHeader.KEEP_ALIVE.asString()));
|
||||||
Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
|
Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
|
||||||
ShuffleHeader header = new ShuffleHeader();
|
ShuffleHeader header = new ShuffleHeader();
|
||||||
header.readFields(input);
|
header.readFields(input);
|
||||||
@ -434,10 +435,10 @@ protected void sendError(ChannelHandlerContext ctx, String message,
|
|||||||
ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION);
|
ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION);
|
||||||
conn.connect();
|
conn.connect();
|
||||||
input = new DataInputStream(conn.getInputStream());
|
input = new DataInputStream(conn.getInputStream());
|
||||||
Assert.assertEquals(HttpHeaders.KEEP_ALIVE,
|
Assert.assertEquals(HttpHeader.KEEP_ALIVE.asString(),
|
||||||
conn.getHeaderField(HttpHeaders.CONNECTION));
|
conn.getHeaderField(HttpHeader.CONNECTION.asString()));
|
||||||
Assert.assertEquals("timeout=1",
|
Assert.assertEquals("timeout=1",
|
||||||
conn.getHeaderField(HttpHeaders.KEEP_ALIVE));
|
conn.getHeaderField(HttpHeader.KEEP_ALIVE.asString()));
|
||||||
Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
|
Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode());
|
||||||
header = new ShuffleHeader();
|
header = new ShuffleHeader();
|
||||||
header.readFields(input);
|
header.readFields(input);
|
||||||
|
@ -46,8 +46,8 @@
|
|||||||
<artifactId>avro</artifactId>
|
<artifactId>avro</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.apache.ant</groupId>
|
<groupId>org.apache.ant</groupId>
|
||||||
|
@ -52,8 +52,8 @@
|
|||||||
<artifactId>avro</artifactId>
|
<artifactId>avro</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.apache.ant</groupId>
|
<groupId>org.apache.ant</groupId>
|
||||||
|
@ -55,6 +55,10 @@
|
|||||||
<groupId>org.codehaus.jackson</groupId>
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
<artifactId>jackson-mapper-asl</artifactId>
|
<artifactId>jackson-mapper-asl</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
@ -0,0 +1,125 @@
|
|||||||
|
/*
|
||||||
|
* Licensed 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.hadoop.maven.plugin.resourcegz;
|
||||||
|
|
||||||
|
import com.google.inject.internal.util.Lists;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.apache.maven.plugin.AbstractMojo;
|
||||||
|
import org.apache.maven.plugin.MojoExecutionException;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
|
import org.apache.maven.plugins.annotations.Mojo;
|
||||||
|
import org.apache.maven.plugins.annotations.Parameter;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.zip.GZIPOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ResourceGzMojo will gzip files.
|
||||||
|
* It is meant to be used for gzipping website resource files (e.g. .js, .css,
|
||||||
|
* etc). It takes an input directory, output directory, and extensions to
|
||||||
|
* process and will generate the .gz files. Any additional directory structure
|
||||||
|
* beyond the input directory is preserved in the output directory.
|
||||||
|
*/
|
||||||
|
@Mojo(name="resource-gz")
|
||||||
|
public class ResourceGzMojo extends AbstractMojo {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The input directory. Will be searched recursively and its directory
|
||||||
|
* structure will be maintaned in the outputDirectory.
|
||||||
|
*/
|
||||||
|
@Parameter(property = "inputDirectory", required = true)
|
||||||
|
private String inputDirectory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The output directory.
|
||||||
|
*/
|
||||||
|
@Parameter(property = "outputDirectory", required = true)
|
||||||
|
private String outputDirectory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A comma separated list of extensions to include.
|
||||||
|
*/
|
||||||
|
@Parameter(property = "extensions", required = true)
|
||||||
|
private String extensions;
|
||||||
|
|
||||||
|
public void execute() throws MojoExecutionException, MojoFailureException {
|
||||||
|
try {
|
||||||
|
Path inputDir = new File(inputDirectory).toPath();
|
||||||
|
File outputDir = new File(outputDirectory);
|
||||||
|
List<String> exts = Lists.newArrayList(extensions.split(","));
|
||||||
|
exts.replaceAll(String::trim);
|
||||||
|
GZConsumer cons = new GZConsumer(inputDir.toFile(), outputDir);
|
||||||
|
Files.walk(inputDir).filter(path -> {
|
||||||
|
for (String ext : exts) {
|
||||||
|
if (path.getFileName().toString().endsWith("." + ext)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).forEach(cons);
|
||||||
|
if (cons.getThrowable() != null) {
|
||||||
|
throw new MojoExecutionException(cons.getThrowable().toString(),
|
||||||
|
cons.getThrowable());
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
throw new MojoExecutionException(t.toString(), t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class GZConsumer implements Consumer<Path> {
|
||||||
|
private final File inputDir;
|
||||||
|
private final File outputDir;
|
||||||
|
private Throwable throwable;
|
||||||
|
|
||||||
|
public GZConsumer(File inputDir, File outputDir) {
|
||||||
|
this.inputDir = inputDir;
|
||||||
|
this.outputDir = outputDir;
|
||||||
|
this.throwable = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(Path path) {
|
||||||
|
if (throwable != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
File outFile = new File(outputDir, path.toFile().getCanonicalPath()
|
||||||
|
.replaceFirst(inputDir.getCanonicalPath(), "") + ".gz");
|
||||||
|
outFile.getParentFile().mkdirs();
|
||||||
|
try (
|
||||||
|
GZIPOutputStream os = new GZIPOutputStream(
|
||||||
|
new FileOutputStream(outFile));
|
||||||
|
BufferedReader is = Files.newBufferedReader(path)
|
||||||
|
) {
|
||||||
|
getLog().info("Compressing " + path + " to " + outFile);
|
||||||
|
IOUtils.copy(is, os);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
this.throwable = t;
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
this.throwable = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Throwable getThrowable() {
|
||||||
|
return throwable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
<failIfNoTests>false</failIfNoTests>
|
<failIfNoTests>false</failIfNoTests>
|
||||||
<maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile>
|
<maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile>
|
||||||
<jetty.version>6.1.26</jetty.version>
|
<jetty.version>9.3.11.v20160721</jetty.version>
|
||||||
<test.exclude>_</test.exclude>
|
<test.exclude>_</test.exclude>
|
||||||
<test.exclude.pattern>_</test.exclude.pattern>
|
<test.exclude.pattern>_</test.exclude.pattern>
|
||||||
|
|
||||||
@ -518,28 +518,38 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<version>2.5</version>
|
<version>3.1.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
<version>${jetty.version}</version>
|
<version>${jetty.version}</version>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<version>${jetty.version}</version>
|
<version>${jetty.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-sslengine</artifactId>
|
<artifactId>jetty-servlet</artifactId>
|
||||||
|
<version>${jetty.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-webapp</artifactId>
|
||||||
|
<version>${jetty.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-util-ajax</artifactId>
|
||||||
<version>${jetty.version}</version>
|
<version>${jetty.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -636,11 +646,23 @@
|
|||||||
<artifactId>jersey-test-framework-core</artifactId>
|
<artifactId>jersey-test-framework-core</artifactId>
|
||||||
<version>${jersey.version}</version>
|
<version>${jersey.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.jersey.jersey-test-framework</groupId>
|
<groupId>com.sun.jersey.jersey-test-framework</groupId>
|
||||||
<artifactId>jersey-test-framework-grizzly2</artifactId>
|
<artifactId>jersey-test-framework-grizzly2</artifactId>
|
||||||
<version>${jersey.version}</version>
|
<version>${jersey.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -668,7 +690,7 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-servlet-tester</artifactId>
|
<artifactId>jetty-servlet-tester</artifactId>
|
||||||
<version>${jetty.version}</version>
|
<version>${jetty.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
@ -687,7 +709,7 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
@ -847,6 +869,12 @@
|
|||||||
<groupId>org.mock-server</groupId>
|
<groupId>org.mock-server</groupId>
|
||||||
<artifactId>mockserver-netty</artifactId>
|
<artifactId>mockserver-netty</artifactId>
|
||||||
<version>3.9.2</version>
|
<version>3.9.2</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.avro</groupId>
|
<groupId>org.apache.avro</groupId>
|
||||||
|
@ -135,7 +135,7 @@
|
|||||||
<artifactId>hadoop-client</artifactId>
|
<artifactId>hadoop-client</artifactId>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
|
@ -165,13 +165,18 @@
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.guava</groupId>
|
<groupId>com.google.guava</groupId>
|
||||||
<artifactId>guava</artifactId>
|
<artifactId>guava</artifactId>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-util-ajax</artifactId>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- dependencies use for test only -->
|
<!-- dependencies use for test only -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -59,7 +59,7 @@
|
|||||||
import org.apache.hadoop.fs.permission.FsPermission;
|
import org.apache.hadoop.fs.permission.FsPermission;
|
||||||
import org.apache.hadoop.fs.permission.PermissionStatus;
|
import org.apache.hadoop.fs.permission.PermissionStatus;
|
||||||
import org.apache.hadoop.io.IOUtils;
|
import org.apache.hadoop.io.IOUtils;
|
||||||
import org.mortbay.util.ajax.JSON;
|
import org.eclipse.jetty.util.ajax.JSON;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
import org.apache.hadoop.fs.FSExceptionMessages;
|
import org.apache.hadoop.fs.FSExceptionMessages;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.apache.hadoop.fs.azure.StorageInterface.CloudBlockBlobWrapper;
|
import org.apache.hadoop.fs.azure.StorageInterface.CloudBlockBlobWrapper;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -760,7 +760,7 @@ public void run() {
|
|||||||
dataPayload.length, new BlobRequestOptions(), opContext);
|
dataPayload.length, new BlobRequestOptions(), opContext);
|
||||||
break;
|
break;
|
||||||
} catch(Exception ioe) {
|
} catch(Exception ioe) {
|
||||||
Log.debug("Encountered exception during uploading block for Blob : {} Exception : {}", key, ioe);
|
Log.getLog().debug("Encountered exception during uploading block for Blob : {} Exception : {}", key, ioe);
|
||||||
uploadRetryAttempts++;
|
uploadRetryAttempts++;
|
||||||
lastLocalException = new IOException("Encountered Exception while uploading block", ioe);
|
lastLocalException = new IOException("Encountered Exception while uploading block", ioe);
|
||||||
try {
|
try {
|
||||||
@ -814,7 +814,7 @@ public void run() {
|
|||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.debug("Attempting to renew append lease on {}", key);
|
Log.getLog().debug("Attempting to renew append lease on {}", key);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!leaseFreed) {
|
if (!leaseFreed) {
|
||||||
|
@ -55,18 +55,18 @@
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty</artifactId>
|
<artifactId>jetty-server</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
<exclusion>
|
<exclusion>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
@ -38,16 +39,16 @@
|
|||||||
import org.apache.hadoop.yarn.sls.scheduler.FairSchedulerMetrics;
|
import org.apache.hadoop.yarn.sls.scheduler.FairSchedulerMetrics;
|
||||||
import org.apache.hadoop.yarn.sls.scheduler.SchedulerMetrics;
|
import org.apache.hadoop.yarn.sls.scheduler.SchedulerMetrics;
|
||||||
import org.apache.hadoop.yarn.sls.scheduler.SchedulerWrapper;
|
import org.apache.hadoop.yarn.sls.scheduler.SchedulerWrapper;
|
||||||
import org.mortbay.jetty.Handler;
|
import org.eclipse.jetty.server.Handler;
|
||||||
import org.mortbay.jetty.Request;
|
import org.eclipse.jetty.server.Request;
|
||||||
import org.mortbay.jetty.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
import org.mortbay.jetty.handler.AbstractHandler;
|
|
||||||
import org.mortbay.jetty.handler.ResourceHandler;
|
|
||||||
|
|
||||||
import com.codahale.metrics.Counter;
|
import com.codahale.metrics.Counter;
|
||||||
import com.codahale.metrics.Gauge;
|
import com.codahale.metrics.Gauge;
|
||||||
import com.codahale.metrics.Histogram;
|
import com.codahale.metrics.Histogram;
|
||||||
import com.codahale.metrics.MetricRegistry;
|
import com.codahale.metrics.MetricRegistry;
|
||||||
|
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||||
|
import org.eclipse.jetty.server.handler.ResourceHandler;
|
||||||
|
|
||||||
@Private
|
@Private
|
||||||
@Unstable
|
@Unstable
|
||||||
@ -121,8 +122,10 @@ public void start() throws Exception {
|
|||||||
|
|
||||||
Handler handler = new AbstractHandler() {
|
Handler handler = new AbstractHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handle(String target, HttpServletRequest request,
|
public void handle(String target, Request baseRequest,
|
||||||
HttpServletResponse response, int dispatch) {
|
HttpServletRequest request,
|
||||||
|
HttpServletResponse response)
|
||||||
|
throws IOException, ServletException {
|
||||||
try{
|
try{
|
||||||
// timeunit
|
// timeunit
|
||||||
int timeunit = 1000; // second, divide millionsecond / 1000
|
int timeunit = 1000; // second, divide millionsecond / 1000
|
||||||
@ -144,7 +147,7 @@ public void handle(String target, HttpServletRequest request,
|
|||||||
// js/css request
|
// js/css request
|
||||||
if (target.startsWith("/js") || target.startsWith("/css")) {
|
if (target.startsWith("/js") || target.startsWith("/css")) {
|
||||||
response.setCharacterEncoding("utf-8");
|
response.setCharacterEncoding("utf-8");
|
||||||
staticHandler.handle(target, request, response, dispatch);
|
staticHandler.handle(target, baseRequest, request, response);
|
||||||
} else
|
} else
|
||||||
// json request
|
// json request
|
||||||
if (target.equals("/simulateMetrics")) {
|
if (target.equals("/simulateMetrics")) {
|
||||||
|
@ -99,7 +99,7 @@
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.invocation.InvocationOnMock;
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
|
||||||
@ -654,7 +654,8 @@ public void testAMRMClientMatchStorage() throws YarnException, IOException {
|
|||||||
int iterationsLeft = 3;
|
int iterationsLeft = 3;
|
||||||
while (allocatedContainerCount < 2
|
while (allocatedContainerCount < 2
|
||||||
&& iterationsLeft-- > 0) {
|
&& iterationsLeft-- > 0) {
|
||||||
Log.info(" == alloc " + allocatedContainerCount + " it left " + iterationsLeft);
|
Log.getLog().info("Allocated " + allocatedContainerCount + " containers"
|
||||||
|
+ " with " + iterationsLeft + " iterations left");
|
||||||
AllocateResponse allocResponse = amClient.allocate(0.1f);
|
AllocateResponse allocResponse = amClient.allocate(0.1f);
|
||||||
assertEquals(0, amClient.ask.size());
|
assertEquals(0, amClient.ask.size());
|
||||||
assertEquals(0, amClient.release.size());
|
assertEquals(0, amClient.release.size());
|
||||||
@ -822,7 +823,8 @@ private int getAllocatedContainersNumber(
|
|||||||
throws YarnException, IOException {
|
throws YarnException, IOException {
|
||||||
int allocatedContainerCount = 0;
|
int allocatedContainerCount = 0;
|
||||||
while (iterationsLeft-- > 0) {
|
while (iterationsLeft-- > 0) {
|
||||||
Log.info(" == alloc " + allocatedContainerCount + " it left " + iterationsLeft);
|
Log.getLog().info("Allocated " + allocatedContainerCount + " containers"
|
||||||
|
+ " with " + iterationsLeft + " iterations left");
|
||||||
AllocateResponse allocResponse = amClient.allocate(0.1f);
|
AllocateResponse allocResponse = amClient.allocate(0.1f);
|
||||||
assertEquals(0, amClient.ask.size());
|
assertEquals(0, amClient.ask.size());
|
||||||
assertEquals(0, amClient.release.size());
|
assertEquals(0, amClient.release.size());
|
||||||
|
@ -84,7 +84,7 @@
|
|||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mortbay.log.Log;
|
import org.eclipse.jetty.util.log.Log;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
@ -325,11 +325,11 @@ public void testGetContainers() throws Exception {
|
|||||||
"http://host:2345", "");
|
"http://host:2345", "");
|
||||||
pw.close();
|
pw.close();
|
||||||
String appReportStr = baos.toString("UTF-8");
|
String appReportStr = baos.toString("UTF-8");
|
||||||
Log.info("ExpectedOutput");
|
Log.getLog().info("ExpectedOutput");
|
||||||
Log.info("["+appReportStr+"]");
|
Log.getLog().info("["+appReportStr+"]");
|
||||||
Log.info("OutputFrom command");
|
Log.getLog().info("OutputFrom command");
|
||||||
String actualOutput = sysOutStream.toString("UTF-8");
|
String actualOutput = sysOutStream.toString("UTF-8");
|
||||||
Log.info("["+actualOutput+"]");
|
Log.getLog().info("["+actualOutput+"]");
|
||||||
Assert.assertEquals(appReportStr, actualOutput);
|
Assert.assertEquals(appReportStr, actualOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,14 +68,14 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-codec</groupId>
|
<groupId>commons-codec</groupId>
|
||||||
<artifactId>commons-codec</artifactId>
|
<artifactId>commons-codec</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mortbay.jetty</groupId>
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
<artifactId>jetty-util</artifactId>
|
<artifactId>jetty-util</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -279,7 +279,18 @@
|
|||||||
<output>${project.build.directory}/generated-sources/java</output>
|
<output>${project.build.directory}/generated-sources/java</output>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>resource-gz</id>
|
||||||
|
<phase>generate-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>resource-gz</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<inputDirectory>${basedir}/src/main/resources/webapps/static</inputDirectory>
|
||||||
|
<outputDirectory>${basedir}/target/classes/webapps/static</outputDirectory>
|
||||||
|
<extensions>js,css</extensions>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* File: jquery.dataTables.min.js
|
||||||
|
* Version: 1.9.4
|
||||||
|
* Author: Allan Jardine (www.sprymedia.co.uk)
|
||||||
|
* Info: www.datatables.net
|
||||||
|
*
|
||||||
|
* Copyright 2008-2012 Allan Jardine, all rights reserved.
|
||||||
|
*
|
||||||
|
* This source file is free software, under either the GPL v2 license or a
|
||||||
|
* BSD style license, available at:
|
||||||
|
* http://datatables.net/license_gpl2
|
||||||
|
* http://datatables.net/license_bsd
|
||||||
|
*
|
||||||
|
* This source file is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
|
||||||
|
*/
|
||||||
|
(function(la,s,p){(function(i){if(typeof define==="function"&&define.amd)define(["jquery"],i);else jQuery&&!jQuery.fn.dataTable&&i(jQuery)})(function(i){var l=function(h){function n(a,b){var c=l.defaults.columns,d=a.aoColumns.length;b=i.extend({},l.models.oColumn,c,{sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSortJUI,nTh:b?b:s.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.oDefaults:d});a.aoColumns.push(b);if(a.aoPreSearchCols[d]===
|
||||||
|
p||a.aoPreSearchCols[d]===null)a.aoPreSearchCols[d]=i.extend({},l.models.oSearch);else{b=a.aoPreSearchCols[d];if(b.bRegex===p)b.bRegex=true;if(b.bSmart===p)b.bSmart=true;if(b.bCaseInsensitive===p)b.bCaseInsensitive=true}q(a,d,null)}function q(a,b,c){var d=a.aoColumns[b];if(c!==p&&c!==null){if(c.mDataProp&&!c.mData)c.mData=c.mDataProp;if(c.sType!==p){d.sType=c.sType;d._bAutoType=false}i.extend(d,c);r(d,c,"sWidth","sWidthOrig");if(c.iDataSort!==p)d.aDataSort=[c.iDataSort];r(d,c,"aDataSort")}var e=d.mRender?
|
||||||
|
ca(d.mRender):null,f=ca(d.mData);d.fnGetData=function(g,j){var k=f(g,j);if(d.mRender&&j&&j!=="")return e(k,j,g);return k};d.fnSetData=Ja(d.mData);if(!a.oFeatures.bSort)d.bSortable=false;if(!d.bSortable||i.inArray("asc",d.asSorting)==-1&&i.inArray("desc",d.asSorting)==-1){d.sSortingClass=a.oClasses.sSortableNone;d.sSortingClassJUI=""}else if(i.inArray("asc",d.asSorting)==-1&&i.inArray("desc",d.asSorting)==-1){d.sSortingClass=a.oClasses.sSortable;d.sSortingClassJUI=a.oClasses.sSortJUI}else if(i.inArray("asc",
|
||||||
|
d.asSorting)!=-1&&i.inArray("desc",d.asSorting)==-1){d.sSortingClass=a.oClasses.sSortableAsc;d.sSortingClassJUI=a.oClasses.sSortJUIAscAllowed}else if(i.inArray("asc",d.asSorting)==-1&&i.inArray("desc",d.asSorting)!=-1){d.sSortingClass=a.oClasses.sSortableDesc;d.sSortingClassJUI=a.oClasses.sSortJUIDescAllowed}}function o(a){if(a.oFeatures.bAutoWidth===false)return false;ta(a);for(var b=0,c=a.aoColumns.length;b<c;b++)a.aoColumns[b].nTh.style.width=a.aoColumns[b].sWidth}function v(a,b){a=A(a,"bVisible");
|
||||||
|
return typeof a[b]==="number"?a[b]:null}function w(a,b){a=A(a,"bVisible");b=i.inArray(b,a);return b!==-1?b:null}function D(a){return A(a,"bVisible").length}function A(a,b){var c=[];i.map(a.aoColumns,function(d,e){d[b]&&c.push(e)});return c}function G(a){for(var b=l.ext.aTypes,c=b.length,d=0;d<c;d++){var e=b[d](a);if(e!==null)return e}return"string"}function E(a,b){b=b.split(",");for(var c=[],d=0,e=a.aoColumns.length;d<e;d++)for(var f=0;f<e;f++)if(a.aoColumns[d].sName==b[f]){c.push(f);break}return c}
|
||||||
|
function Y(a){for(var b="",c=0,d=a.aoColumns.length;c<d;c++)b+=a.aoColumns[c].sName+",";if(b.length==d)return"";return b.slice(0,-1)}function ma(a,b,c,d){var e,f,g,j,k;if(b)for(e=b.length-1;e>=0;e--){var m=b[e].aTargets;i.isArray(m)||O(a,1,"aTargets must be an array of targets, not a "+typeof m);f=0;for(g=m.length;f<g;f++)if(typeof m[f]==="number"&&m[f]>=0){for(;a.aoColumns.length<=m[f];)n(a);d(m[f],b[e])}else if(typeof m[f]==="number"&&m[f]<0)d(a.aoColumns.length+m[f],b[e]);else if(typeof m[f]===
|
||||||
|
"string"){j=0;for(k=a.aoColumns.length;j<k;j++)if(m[f]=="_all"||i(a.aoColumns[j].nTh).hasClass(m[f]))d(j,b[e])}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function R(a,b){var c;c=i.isArray(b)?b.slice():i.extend(true,{},b);b=a.aoData.length;var d=i.extend(true,{},l.models.oRow);d._aData=c;a.aoData.push(d);var e;d=0;for(var f=a.aoColumns.length;d<f;d++){c=a.aoColumns[d];typeof c.fnRender==="function"&&c.bUseRendered&&c.mData!==null?S(a,b,d,da(a,b,d)):S(a,b,d,F(a,b,d));if(c._bAutoType&&c.sType!="string"){e=
|
||||||
|
F(a,b,d,"type");if(e!==null&&e!==""){e=G(e);if(c.sType===null)c.sType=e;else if(c.sType!=e&&c.sType!="html")c.sType="string"}}}a.aiDisplayMaster.push(b);a.oFeatures.bDeferRender||ua(a,b);return b}function ea(a){var b,c,d,e,f,g,j;if(a.bDeferLoading||a.sAjaxSource===null)for(b=a.nTBody.firstChild;b;){if(b.nodeName.toUpperCase()=="TR"){c=a.aoData.length;b._DT_RowIndex=c;a.aoData.push(i.extend(true,{},l.models.oRow,{nTr:b}));a.aiDisplayMaster.push(c);f=b.firstChild;for(d=0;f;){g=f.nodeName.toUpperCase();
|
||||||
|
if(g=="TD"||g=="TH"){S(a,c,d,i.trim(f.innerHTML));d++}f=f.nextSibling}}b=b.nextSibling}e=fa(a);d=[];b=0;for(c=e.length;b<c;b++)for(f=e[b].firstChild;f;){g=f.nodeName.toUpperCase();if(g=="TD"||g=="TH")d.push(f);f=f.nextSibling}c=0;for(e=a.aoColumns.length;c<e;c++){j=a.aoColumns[c];if(j.sTitle===null)j.sTitle=j.nTh.innerHTML;var k=j._bAutoType,m=typeof j.fnRender==="function",u=j.sClass!==null,x=j.bVisible,y,B;if(k||m||u||!x){g=0;for(b=a.aoData.length;g<b;g++){f=a.aoData[g];y=d[g*e+c];if(k&&j.sType!=
|
||||||
|
"string"){B=F(a,g,c,"type");if(B!==""){B=G(B);if(j.sType===null)j.sType=B;else if(j.sType!=B&&j.sType!="html")j.sType="string"}}if(j.mRender)y.innerHTML=F(a,g,c,"display");else if(j.mData!==c)y.innerHTML=F(a,g,c,"display");if(m){B=da(a,g,c);y.innerHTML=B;j.bUseRendered&&S(a,g,c,B)}if(u)y.className+=" "+j.sClass;if(x)f._anHidden[c]=null;else{f._anHidden[c]=y;y.parentNode.removeChild(y)}j.fnCreatedCell&&j.fnCreatedCell.call(a.oInstance,y,F(a,g,c,"display"),f._aData,g,c)}}}if(a.aoRowCreatedCallback.length!==
|
||||||
|
0){b=0;for(c=a.aoData.length;b<c;b++){f=a.aoData[b];K(a,"aoRowCreatedCallback",null,[f.nTr,f._aData,b])}}}function V(a,b){return b._DT_RowIndex!==p?b._DT_RowIndex:null}function va(a,b,c){b=W(a,b);var d=0;for(a=a.aoColumns.length;d<a;d++)if(b[d]===c)return d;return-1}function na(a,b,c,d){for(var e=[],f=0,g=d.length;f<g;f++)e.push(F(a,b,d[f],c));return e}function F(a,b,c,d){var e=a.aoColumns[c];if((c=e.fnGetData(a.aoData[b]._aData,d))===p){if(a.iDrawError!=a.iDraw&&e.sDefaultContent===null){O(a,0,"Requested unknown parameter "+
|
||||||
|
(typeof e.mData=="function"?"{mData function}":"'"+e.mData+"'")+" from the data source for row "+b);a.iDrawError=a.iDraw}return e.sDefaultContent}if(c===null&&e.sDefaultContent!==null)c=e.sDefaultContent;else if(typeof c==="function")return c();if(d=="display"&&c===null)return"";return c}function S(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d)}function ca(a){if(a===null)return function(){return null};else if(typeof a==="function")return function(c,d,e){return a(c,d,e)};else if(typeof a===
|
||||||
|
"string"&&(a.indexOf(".")!==-1||a.indexOf("[")!==-1)){var b=function(c,d,e){var f=e.split("."),g;if(e!==""){var j=0;for(g=f.length;j<g;j++){if(e=f[j].match(ga)){f[j]=f[j].replace(ga,"");if(f[j]!=="")c=c[f[j]];g=[];f.splice(0,j+1);f=f.join(".");j=0;for(var k=c.length;j<k;j++)g.push(b(c[j],d,f));c=e[0].substring(1,e[0].length-1);c=c===""?g:g.join(c);break}if(c===null||c[f[j]]===p)return p;c=c[f[j]]}}return c};return function(c,d){return b(c,d,a)}}else return function(c){return c[a]}}function Ja(a){if(a===
|
||||||
|
null)return function(){};else if(typeof a==="function")return function(c,d){a(c,"set",d)};else if(typeof a==="string"&&(a.indexOf(".")!==-1||a.indexOf("[")!==-1)){var b=function(c,d,e){e=e.split(".");var f,g,j=0;for(g=e.length-1;j<g;j++){if(f=e[j].match(ga)){e[j]=e[j].replace(ga,"");c[e[j]]=[];f=e.slice();f.splice(0,j+1);g=f.join(".");for(var k=0,m=d.length;k<m;k++){f={};b(f,d[k],g);c[e[j]].push(f)}return}if(c[e[j]]===null||c[e[j]]===p)c[e[j]]={};c=c[e[j]]}c[e[e.length-1].replace(ga,"")]=d};return function(c,
|
||||||
|
d){return b(c,d,a)}}else return function(c,d){c[a]=d}}function oa(a){for(var b=[],c=a.aoData.length,d=0;d<c;d++)b.push(a.aoData[d]._aData);return b}function wa(a){a.aoData.splice(0,a.aoData.length);a.aiDisplayMaster.splice(0,a.aiDisplayMaster.length);a.aiDisplay.splice(0,a.aiDisplay.length);I(a)}function xa(a,b){for(var c=-1,d=0,e=a.length;d<e;d++)if(a[d]==b)c=d;else a[d]>b&&a[d]--;c!=-1&&a.splice(c,1)}function da(a,b,c){var d=a.aoColumns[c];return d.fnRender({iDataRow:b,iDataColumn:c,oSettings:a,
|
||||||
|
aData:a.aoData[b]._aData,mDataProp:d.mData},F(a,b,c,"display"))}function ua(a,b){var c=a.aoData[b],d;if(c.nTr===null){c.nTr=s.createElement("tr");c.nTr._DT_RowIndex=b;if(c._aData.DT_RowId)c.nTr.id=c._aData.DT_RowId;if(c._aData.DT_RowClass)c.nTr.className=c._aData.DT_RowClass;for(var e=0,f=a.aoColumns.length;e<f;e++){var g=a.aoColumns[e];d=s.createElement(g.sCellType);d.innerHTML=typeof g.fnRender==="function"&&(!g.bUseRendered||g.mData===null)?da(a,b,e):F(a,b,e,"display");if(g.sClass!==null)d.className=
|
||||||
|
g.sClass;if(g.bVisible){c.nTr.appendChild(d);c._anHidden[e]=null}else c._anHidden[e]=d;g.fnCreatedCell&&g.fnCreatedCell.call(a.oInstance,d,F(a,b,e,"display"),c._aData,b,e)}K(a,"aoRowCreatedCallback",null,[c.nTr,c._aData,b])}}function Ka(a){var b,c,d;if(i("th, td",a.nTHead).length!==0){b=0;for(d=a.aoColumns.length;b<d;b++){c=a.aoColumns[b].nTh;c.setAttribute("role","columnheader");if(a.aoColumns[b].bSortable){c.setAttribute("tabindex",a.iTabIndex);c.setAttribute("aria-controls",a.sTableId)}a.aoColumns[b].sClass!==
|
||||||
|
null&&i(c).addClass(a.aoColumns[b].sClass);if(a.aoColumns[b].sTitle!=c.innerHTML)c.innerHTML=a.aoColumns[b].sTitle}}else{var e=s.createElement("tr");b=0;for(d=a.aoColumns.length;b<d;b++){c=a.aoColumns[b].nTh;c.innerHTML=a.aoColumns[b].sTitle;c.setAttribute("tabindex","0");a.aoColumns[b].sClass!==null&&i(c).addClass(a.aoColumns[b].sClass);e.appendChild(c)}i(a.nTHead).html("")[0].appendChild(e);ha(a.aoHeader,a.nTHead)}i(a.nTHead).children("tr").attr("role","row");if(a.bJUI){b=0;for(d=a.aoColumns.length;b<
|
||||||
|
d;b++){c=a.aoColumns[b].nTh;e=s.createElement("div");e.className=a.oClasses.sSortJUIWrapper;i(c).contents().appendTo(e);var f=s.createElement("span");f.className=a.oClasses.sSortIcon;e.appendChild(f);c.appendChild(e)}}if(a.oFeatures.bSort)for(b=0;b<a.aoColumns.length;b++)a.aoColumns[b].bSortable!==false?ya(a,a.aoColumns[b].nTh,b):i(a.aoColumns[b].nTh).addClass(a.oClasses.sSortableNone);a.oClasses.sFooterTH!==""&&i(a.nTFoot).children("tr").children("th").addClass(a.oClasses.sFooterTH);if(a.nTFoot!==
|
||||||
|
null){c=Z(a,null,a.aoFooter);b=0;for(d=a.aoColumns.length;b<d;b++)if(c[b]){a.aoColumns[b].nTf=c[b];a.aoColumns[b].sClass&&i(c[b]).addClass(a.aoColumns[b].sClass)}}}function ia(a,b,c){var d,e,f,g=[],j=[],k=a.aoColumns.length,m;if(c===p)c=false;d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=k-1;f>=0;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++){m=k=1;
|
||||||
|
if(j[d][f]===p){a.appendChild(g[d][f].cell);for(j[d][f]=1;g[d+k]!==p&&g[d][f].cell==g[d+k][f].cell;){j[d+k][f]=1;k++}for(;g[d][f+m]!==p&&g[d][f].cell==g[d][f+m].cell;){for(c=0;c<k;c++)j[d+c][f+m]=1;m++}g[d][f].cell.rowSpan=k;g[d][f].cell.colSpan=m}}}}function H(a){var b=K(a,"aoPreDrawCallback","preDraw",[a]);if(i.inArray(false,b)!==-1)P(a,false);else{var c,d;b=[];var e=0,f=a.asStripeClasses.length;c=a.aoOpenRows.length;a.bDrawing=true;if(a.iInitDisplayStart!==p&&a.iInitDisplayStart!=-1){a._iDisplayStart=
|
||||||
|
a.oFeatures.bServerSide?a.iInitDisplayStart:a.iInitDisplayStart>=a.fnRecordsDisplay()?0:a.iInitDisplayStart;a.iInitDisplayStart=-1;I(a)}if(a.bDeferLoading){a.bDeferLoading=false;a.iDraw++}else if(a.oFeatures.bServerSide){if(!a.bDestroying&&!La(a))return}else a.iDraw++;if(a.aiDisplay.length!==0){var g=a._iDisplayStart;d=a._iDisplayEnd;if(a.oFeatures.bServerSide){g=0;d=a.aoData.length}for(g=g;g<d;g++){var j=a.aoData[a.aiDisplay[g]];j.nTr===null&&ua(a,a.aiDisplay[g]);var k=j.nTr;if(f!==0){var m=a.asStripeClasses[e%
|
||||||
|
f];if(j._sRowStripe!=m){i(k).removeClass(j._sRowStripe).addClass(m);j._sRowStripe=m}}K(a,"aoRowCallback",null,[k,a.aoData[a.aiDisplay[g]]._aData,e,g]);b.push(k);e++;if(c!==0)for(j=0;j<c;j++)if(k==a.aoOpenRows[j].nParent){b.push(a.aoOpenRows[j].nTr);break}}}else{b[0]=s.createElement("tr");if(a.asStripeClasses[0])b[0].className=a.asStripeClasses[0];c=a.oLanguage;f=c.sZeroRecords;if(a.iDraw==1&&a.sAjaxSource!==null&&!a.oFeatures.bServerSide)f=c.sLoadingRecords;else if(c.sEmptyTable&&a.fnRecordsTotal()===
|
||||||
|
0)f=c.sEmptyTable;c=s.createElement("td");c.setAttribute("valign","top");c.colSpan=D(a);c.className=a.oClasses.sRowEmpty;c.innerHTML=za(a,f);b[e].appendChild(c)}K(a,"aoHeaderCallback","header",[i(a.nTHead).children("tr")[0],oa(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay]);K(a,"aoFooterCallback","footer",[i(a.nTFoot).children("tr")[0],oa(a),a._iDisplayStart,a.fnDisplayEnd(),a.aiDisplay]);e=s.createDocumentFragment();c=s.createDocumentFragment();if(a.nTBody){f=a.nTBody.parentNode;c.appendChild(a.nTBody);
|
||||||
|
if(!a.oScroll.bInfinite||!a._bInitComplete||a.bSorted||a.bFiltered)for(;c=a.nTBody.firstChild;)a.nTBody.removeChild(c);c=0;for(d=b.length;c<d;c++)e.appendChild(b[c]);a.nTBody.appendChild(e);f!==null&&f.appendChild(a.nTBody)}K(a,"aoDrawCallback","draw",[a]);a.bSorted=false;a.bFiltered=false;a.bDrawing=false;if(a.oFeatures.bServerSide){P(a,false);a._bInitComplete||pa(a)}}}function qa(a){if(a.oFeatures.bSort)$(a,a.oPreviousSearch);else if(a.oFeatures.bFilter)X(a,a.oPreviousSearch);else{I(a);H(a)}}function Ma(a){var b=
|
||||||
|
i("<div></div>")[0];a.nTable.parentNode.insertBefore(b,a.nTable);a.nTableWrapper=i('<div id="'+a.sTableId+'_wrapper" class="'+a.oClasses.sWrapper+'" role="grid"></div>')[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var c=a.nTableWrapper,d=a.sDom.split(""),e,f,g,j,k,m,u,x=0;x<d.length;x++){f=0;g=d[x];if(g=="<"){j=i("<div></div>")[0];k=d[x+1];if(k=="'"||k=='"'){m="";for(u=2;d[x+u]!=k;){m+=d[x+u];u++}if(m=="H")m=a.oClasses.sJUIHeader;else if(m=="F")m=a.oClasses.sJUIFooter;if(m.indexOf(".")!=-1){k=
|
||||||
|
m.split(".");j.id=k[0].substr(1,k[0].length-1);j.className=k[1]}else if(m.charAt(0)=="#")j.id=m.substr(1,m.length-1);else j.className=m;x+=u}c.appendChild(j);c=j}else if(g==">")c=c.parentNode;else if(g=="l"&&a.oFeatures.bPaginate&&a.oFeatures.bLengthChange){e=Na(a);f=1}else if(g=="f"&&a.oFeatures.bFilter){e=Oa(a);f=1}else if(g=="r"&&a.oFeatures.bProcessing){e=Pa(a);f=1}else if(g=="t"){e=Qa(a);f=1}else if(g=="i"&&a.oFeatures.bInfo){e=Ra(a);f=1}else if(g=="p"&&a.oFeatures.bPaginate){e=Sa(a);f=1}else if(l.ext.aoFeatures.length!==
|
||||||
|
0){j=l.ext.aoFeatures;u=0;for(k=j.length;u<k;u++)if(g==j[u].cFeature){if(e=j[u].fnInit(a))f=1;break}}if(f==1&&e!==null){if(typeof a.aanFeatures[g]!=="object")a.aanFeatures[g]=[];a.aanFeatures[g].push(e);c.appendChild(e)}}b.parentNode.replaceChild(a.nTableWrapper,b)}function ha(a,b){b=i(b).children("tr");var c,d,e,f,g,j,k,m,u,x,y=function(B,T,M){for(B=B[T];B[M];)M++;return M};a.splice(0,a.length);e=0;for(j=b.length;e<j;e++)a.push([]);e=0;for(j=b.length;e<j;e++){c=b[e];for(d=c.firstChild;d;){if(d.nodeName.toUpperCase()==
|
||||||
|
"TD"||d.nodeName.toUpperCase()=="TH"){m=d.getAttribute("colspan")*1;u=d.getAttribute("rowspan")*1;m=!m||m===0||m===1?1:m;u=!u||u===0||u===1?1:u;k=y(a,e,0);x=m===1?true:false;for(g=0;g<m;g++)for(f=0;f<u;f++){a[e+f][k+g]={cell:d,unique:x};a[e+f].nTr=c}}d=d.nextSibling}}}function Z(a,b,c){var d=[];if(!c){c=a.aoHeader;if(b){c=[];ha(c,b)}}b=0;for(var e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function La(a){if(a.bAjaxDataGet){a.iDraw++;
|
||||||
|
P(a,true);var b=Ta(a);Aa(a,b);a.fnServerData.call(a.oInstance,a.sAjaxSource,b,function(c){Ua(a,c)},a);return false}else return true}function Ta(a){var b=a.aoColumns.length,c=[],d,e,f,g;c.push({name:"sEcho",value:a.iDraw});c.push({name:"iColumns",value:b});c.push({name:"sColumns",value:Y(a)});c.push({name:"iDisplayStart",value:a._iDisplayStart});c.push({name:"iDisplayLength",value:a.oFeatures.bPaginate!==false?a._iDisplayLength:-1});for(f=0;f<b;f++){d=a.aoColumns[f].mData;c.push({name:"mDataProp_"+
|
||||||
|
f,value:typeof d==="function"?"function":d})}if(a.oFeatures.bFilter!==false){c.push({name:"sSearch",value:a.oPreviousSearch.sSearch});c.push({name:"bRegex",value:a.oPreviousSearch.bRegex});for(f=0;f<b;f++){c.push({name:"sSearch_"+f,value:a.aoPreSearchCols[f].sSearch});c.push({name:"bRegex_"+f,value:a.aoPreSearchCols[f].bRegex});c.push({name:"bSearchable_"+f,value:a.aoColumns[f].bSearchable})}}if(a.oFeatures.bSort!==false){var j=0;d=a.aaSortingFixed!==null?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();
|
||||||
|
for(f=0;f<d.length;f++){e=a.aoColumns[d[f][0]].aDataSort;for(g=0;g<e.length;g++){c.push({name:"iSortCol_"+j,value:e[g]});c.push({name:"sSortDir_"+j,value:d[f][1]});j++}}c.push({name:"iSortingCols",value:j});for(f=0;f<b;f++)c.push({name:"bSortable_"+f,value:a.aoColumns[f].bSortable})}return c}function Aa(a,b){K(a,"aoServerParams","serverParams",[b])}function Ua(a,b){if(b.sEcho!==p)if(b.sEcho*1<a.iDraw)return;else a.iDraw=b.sEcho*1;if(!a.oScroll.bInfinite||a.oScroll.bInfinite&&(a.bSorted||a.bFiltered))wa(a);
|
||||||
|
a._iRecordsTotal=parseInt(b.iTotalRecords,10);a._iRecordsDisplay=parseInt(b.iTotalDisplayRecords,10);var c=Y(a);c=b.sColumns!==p&&c!==""&&b.sColumns!=c;var d;if(c)d=E(a,b.sColumns);b=ca(a.sAjaxDataProp)(b);for(var e=0,f=b.length;e<f;e++)if(c){for(var g=[],j=0,k=a.aoColumns.length;j<k;j++)g.push(b[e][d[j]]);R(a,g)}else R(a,b[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=false;H(a);a.bAjaxDataGet=true;P(a,false)}function Oa(a){var b=a.oPreviousSearch,c=a.oLanguage.sSearch;c=c.indexOf("_INPUT_")!==
|
||||||
|
-1?c.replace("_INPUT_",'<input type="text" />'):c===""?'<input type="text" />':c+' <input type="text" />';var d=s.createElement("div");d.className=a.oClasses.sFilter;d.innerHTML="<label>"+c+"</label>";if(!a.aanFeatures.f)d.id=a.sTableId+"_filter";c=i('input[type="text"]',d);d._DT_Input=c[0];c.val(b.sSearch.replace('"',"""));c.bind("keyup.DT",function(){for(var e=a.aanFeatures.f,f=this.value===""?"":this.value,g=0,j=e.length;g<j;g++)e[g]!=i(this).parents("div.dataTables_filter")[0]&&i(e[g]._DT_Input).val(f);
|
||||||
|
f!=b.sSearch&&X(a,{sSearch:f,bRegex:b.bRegex,bSmart:b.bSmart,bCaseInsensitive:b.bCaseInsensitive})});c.attr("aria-controls",a.sTableId).bind("keypress.DT",function(e){if(e.keyCode==13)return false});return d}function X(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(g){d.sSearch=g.sSearch;d.bRegex=g.bRegex;d.bSmart=g.bSmart;d.bCaseInsensitive=g.bCaseInsensitive};if(a.oFeatures.bServerSide)f(b);else{Va(a,b.sSearch,c,b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<a.aoPreSearchCols.length;b++)Wa(a,
|
||||||
|
e[b].sSearch,b,e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);Xa(a)}a.bFiltered=true;i(a.oInstance).trigger("filter",a);a._iDisplayStart=0;I(a);H(a);Ba(a,0)}function Xa(a){for(var b=l.ext.afnFiltering,c=A(a,"bSearchable"),d=0,e=b.length;d<e;d++)for(var f=0,g=0,j=a.aiDisplay.length;g<j;g++){var k=a.aiDisplay[g-f];if(!b[d](a,na(a,k,"filter",c),k)){a.aiDisplay.splice(g-f,1);f++}}}function Wa(a,b,c,d,e,f){if(b!==""){var g=0;b=Ca(b,d,e,f);for(d=a.aiDisplay.length-1;d>=0;d--){e=Ya(F(a,a.aiDisplay[d],c,
|
||||||
|
"filter"),a.aoColumns[c].sType);if(!b.test(e)){a.aiDisplay.splice(d,1);g++}}}}function Va(a,b,c,d,e,f){d=Ca(b,d,e,f);e=a.oPreviousSearch;c||(c=0);if(l.ext.afnFiltering.length!==0)c=1;if(b.length<=0){a.aiDisplay.splice(0,a.aiDisplay.length);a.aiDisplay=a.aiDisplayMaster.slice()}else if(a.aiDisplay.length==a.aiDisplayMaster.length||e.sSearch.length>b.length||c==1||b.indexOf(e.sSearch)!==0){a.aiDisplay.splice(0,a.aiDisplay.length);Ba(a,1);for(b=0;b<a.aiDisplayMaster.length;b++)d.test(a.asDataSearch[b])&&
|
||||||
|
a.aiDisplay.push(a.aiDisplayMaster[b])}else for(b=c=0;b<a.asDataSearch.length;b++)if(!d.test(a.asDataSearch[b])){a.aiDisplay.splice(b-c,1);c++}}function Ba(a,b){if(!a.oFeatures.bServerSide){a.asDataSearch=[];var c=A(a,"bSearchable");b=b===1?a.aiDisplayMaster:a.aiDisplay;for(var d=0,e=b.length;d<e;d++)a.asDataSearch[d]=Da(a,na(a,b[d],"filter",c))}}function Da(a,b){a=b.join(" ");if(a.indexOf("&")!==-1)a=i("<div>").html(a).text();return a.replace(/[\n\r]/g," ")}function Ca(a,b,c,d){if(c){a=b?a.split(" "):
|
||||||
|
Ea(a).split(" ");a="^(?=.*?"+a.join(")(?=.*?")+").*$";return new RegExp(a,d?"i":"")}else{a=b?a:Ea(a);return new RegExp(a,d?"i":"")}}function Ya(a,b){if(typeof l.ext.ofnSearch[b]==="function")return l.ext.ofnSearch[b](a);else if(a===null)return"";else if(b=="html")return a.replace(/[\r\n]/g," ").replace(/<.*?>/g,"");else if(typeof a==="string")return a.replace(/[\r\n]/g," ");return a}function Ea(a){return a.replace(new RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),
|
||||||
|
"\\$1")}function Ra(a){var b=s.createElement("div");b.className=a.oClasses.sInfo;if(!a.aanFeatures.i){a.aoDrawCallback.push({fn:Za,sName:"information"});b.id=a.sTableId+"_info"}a.nTable.setAttribute("aria-describedby",a.sTableId+"_info");return b}function Za(a){if(!(!a.oFeatures.bInfo||a.aanFeatures.i.length===0)){var b=a.oLanguage,c=a._iDisplayStart+1,d=a.fnDisplayEnd(),e=a.fnRecordsTotal(),f=a.fnRecordsDisplay(),g;g=f===0?b.sInfoEmpty:b.sInfo;if(f!=e)g+=" "+b.sInfoFiltered;g+=b.sInfoPostFix;g=za(a,
|
||||||
|
g);if(b.fnInfoCallback!==null)g=b.fnInfoCallback.call(a.oInstance,a,c,d,e,f,g);a=a.aanFeatures.i;b=0;for(c=a.length;b<c;b++)i(a[b]).html(g)}}function za(a,b){var c=a.fnFormatNumber(a._iDisplayStart+1),d=a.fnDisplayEnd();d=a.fnFormatNumber(d);var e=a.fnRecordsDisplay();e=a.fnFormatNumber(e);var f=a.fnRecordsTotal();f=a.fnFormatNumber(f);if(a.oScroll.bInfinite)c=a.fnFormatNumber(1);return b.replace(/_START_/g,c).replace(/_END_/g,d).replace(/_TOTAL_/g,e).replace(/_MAX_/g,f)}function ra(a){var b,c,d=
|
||||||
|
a.iInitDisplayStart;if(a.bInitialised===false)setTimeout(function(){ra(a)},200);else{Ma(a);Ka(a);ia(a,a.aoHeader);a.nTFoot&&ia(a,a.aoFooter);P(a,true);a.oFeatures.bAutoWidth&&ta(a);b=0;for(c=a.aoColumns.length;b<c;b++)if(a.aoColumns[b].sWidth!==null)a.aoColumns[b].nTh.style.width=t(a.aoColumns[b].sWidth);if(a.oFeatures.bSort)$(a);else if(a.oFeatures.bFilter)X(a,a.oPreviousSearch);else{a.aiDisplay=a.aiDisplayMaster.slice();I(a);H(a)}if(a.sAjaxSource!==null&&!a.oFeatures.bServerSide){c=[];Aa(a,c);a.fnServerData.call(a.oInstance,
|
||||||
|
a.sAjaxSource,c,function(e){var f=a.sAjaxDataProp!==""?ca(a.sAjaxDataProp)(e):e;for(b=0;b<f.length;b++)R(a,f[b]);a.iInitDisplayStart=d;if(a.oFeatures.bSort)$(a);else{a.aiDisplay=a.aiDisplayMaster.slice();I(a);H(a)}P(a,false);pa(a,e)},a)}else if(!a.oFeatures.bServerSide){P(a,false);pa(a)}}}function pa(a,b){a._bInitComplete=true;K(a,"aoInitComplete","init",[a,b])}function Fa(a){var b=l.defaults.oLanguage;!a.sEmptyTable&&a.sZeroRecords&&b.sEmptyTable==="No data available in table"&&r(a,a,"sZeroRecords",
|
||||||
|
"sEmptyTable");!a.sLoadingRecords&&a.sZeroRecords&&b.sLoadingRecords==="Loading..."&&r(a,a,"sZeroRecords","sLoadingRecords")}function Na(a){if(a.oScroll.bInfinite)return null;var b='<select size="1" '+('name="'+a.sTableId+'_length"')+">",c,d,e=a.aLengthMenu;if(e.length==2&&typeof e[0]==="object"&&typeof e[1]==="object"){c=0;for(d=e[0].length;c<d;c++)b+='<option value="'+e[0][c]+'">'+e[1][c]+"</option>"}else{c=0;for(d=e.length;c<d;c++)b+='<option value="'+e[c]+'">'+e[c]+"</option>"}b+="</select>";
|
||||||
|
e=s.createElement("div");if(!a.aanFeatures.l)e.id=a.sTableId+"_length";e.className=a.oClasses.sLength;e.innerHTML="<label>"+a.oLanguage.sLengthMenu.replace("_MENU_",b)+"</label>";i('select option[value="'+a._iDisplayLength+'"]',e).attr("selected",true);i("select",e).bind("change.DT",function(){var f=i(this).val(),g=a.aanFeatures.l;c=0;for(d=g.length;c<d;c++)g[c]!=this.parentNode&&i("select",g[c]).val(f);a._iDisplayLength=parseInt(f,10);I(a);if(a.fnDisplayEnd()==a.fnRecordsDisplay()){a._iDisplayStart=
|
||||||
|
a.fnDisplayEnd()-a._iDisplayLength;if(a._iDisplayStart<0)a._iDisplayStart=0}if(a._iDisplayLength==-1)a._iDisplayStart=0;H(a)});i("select",e).attr("aria-controls",a.sTableId);return e}function I(a){a._iDisplayEnd=a.oFeatures.bPaginate===false?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength>a.aiDisplay.length||a._iDisplayLength==-1?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength}function Sa(a){if(a.oScroll.bInfinite)return null;var b=s.createElement("div");b.className=a.oClasses.sPaging+
|
||||||
|
a.sPaginationType;l.ext.oPagination[a.sPaginationType].fnInit(a,b,function(c){I(c);H(c)});a.aanFeatures.p||a.aoDrawCallback.push({fn:function(c){l.ext.oPagination[c.sPaginationType].fnUpdate(c,function(d){I(d);H(d)})},sName:"pagination"});return b}function Ga(a,b){var c=a._iDisplayStart;if(typeof b==="number"){a._iDisplayStart=b*a._iDisplayLength;if(a._iDisplayStart>a.fnRecordsDisplay())a._iDisplayStart=0}else if(b=="first")a._iDisplayStart=0;else if(b=="previous"){a._iDisplayStart=a._iDisplayLength>=
|
||||||
|
0?a._iDisplayStart-a._iDisplayLength:0;if(a._iDisplayStart<0)a._iDisplayStart=0}else if(b=="next")if(a._iDisplayLength>=0){if(a._iDisplayStart+a._iDisplayLength<a.fnRecordsDisplay())a._iDisplayStart+=a._iDisplayLength}else a._iDisplayStart=0;else if(b=="last")if(a._iDisplayLength>=0){b=parseInt((a.fnRecordsDisplay()-1)/a._iDisplayLength,10)+1;a._iDisplayStart=(b-1)*a._iDisplayLength}else a._iDisplayStart=0;else O(a,0,"Unknown paging action: "+b);i(a.oInstance).trigger("page",a);return c!=a._iDisplayStart}
|
||||||
|
function Pa(a){var b=s.createElement("div");if(!a.aanFeatures.r)b.id=a.sTableId+"_processing";b.innerHTML=a.oLanguage.sProcessing;b.className=a.oClasses.sProcessing;a.nTable.parentNode.insertBefore(b,a.nTable);return b}function P(a,b){if(a.oFeatures.bProcessing)for(var c=a.aanFeatures.r,d=0,e=c.length;d<e;d++)c[d].style.visibility=b?"visible":"hidden";i(a.oInstance).trigger("processing",[a,b])}function Qa(a){if(a.oScroll.sX===""&&a.oScroll.sY==="")return a.nTable;var b=s.createElement("div"),c=s.createElement("div"),
|
||||||
|
d=s.createElement("div"),e=s.createElement("div"),f=s.createElement("div"),g=s.createElement("div"),j=a.nTable.cloneNode(false),k=a.nTable.cloneNode(false),m=a.nTable.getElementsByTagName("thead")[0],u=a.nTable.getElementsByTagName("tfoot").length===0?null:a.nTable.getElementsByTagName("tfoot")[0],x=a.oClasses;c.appendChild(d);f.appendChild(g);e.appendChild(a.nTable);b.appendChild(c);b.appendChild(e);d.appendChild(j);j.appendChild(m);if(u!==null){b.appendChild(f);g.appendChild(k);k.appendChild(u)}b.className=
|
||||||
|
x.sScrollWrapper;c.className=x.sScrollHead;d.className=x.sScrollHeadInner;e.className=x.sScrollBody;f.className=x.sScrollFoot;g.className=x.sScrollFootInner;if(a.oScroll.bAutoCss){c.style.overflow="hidden";c.style.position="relative";f.style.overflow="hidden";e.style.overflow="auto"}c.style.border="0";c.style.width="100%";f.style.border="0";d.style.width=a.oScroll.sXInner!==""?a.oScroll.sXInner:"100%";j.removeAttribute("id");j.style.marginLeft="0";a.nTable.style.marginLeft="0";if(u!==null){k.removeAttribute("id");
|
||||||
|
k.style.marginLeft="0"}d=i(a.nTable).children("caption");if(d.length>0){d=d[0];if(d._captionSide==="top")j.appendChild(d);else d._captionSide==="bottom"&&u&&k.appendChild(d)}if(a.oScroll.sX!==""){c.style.width=t(a.oScroll.sX);e.style.width=t(a.oScroll.sX);if(u!==null)f.style.width=t(a.oScroll.sX);i(e).scroll(function(){c.scrollLeft=this.scrollLeft;if(u!==null)f.scrollLeft=this.scrollLeft})}if(a.oScroll.sY!=="")e.style.height=t(a.oScroll.sY);a.aoDrawCallback.push({fn:$a,sName:"scrolling"});a.oScroll.bInfinite&&
|
||||||
|
i(e).scroll(function(){if(!a.bDrawing&&i(this).scrollTop()!==0)if(i(this).scrollTop()+i(this).height()>i(a.nTable).height()-a.oScroll.iLoadGap)if(a.fnDisplayEnd()<a.fnRecordsDisplay()){Ga(a,"next");I(a);H(a)}});a.nScrollHead=c;a.nScrollFoot=f;return b}function $a(a){var b=a.nScrollHead.getElementsByTagName("div")[0],c=b.getElementsByTagName("table")[0],d=a.nTable.parentNode,e,f,g,j,k,m,u,x,y=[],B=[],T=a.nTFoot!==null?a.nScrollFoot.getElementsByTagName("div")[0]:null,M=a.nTFoot!==null?T.getElementsByTagName("table")[0]:
|
||||||
|
null,L=a.oBrowser.bScrollOversize,ja=function(z){u=z.style;u.paddingTop="0";u.paddingBottom="0";u.borderTopWidth="0";u.borderBottomWidth="0";u.height=0};i(a.nTable).children("thead, tfoot").remove();e=i(a.nTHead).clone()[0];a.nTable.insertBefore(e,a.nTable.childNodes[0]);g=a.nTHead.getElementsByTagName("tr");j=e.getElementsByTagName("tr");if(a.nTFoot!==null){k=i(a.nTFoot).clone()[0];a.nTable.insertBefore(k,a.nTable.childNodes[1]);m=a.nTFoot.getElementsByTagName("tr");k=k.getElementsByTagName("tr")}if(a.oScroll.sX===
|
||||||
|
""){d.style.width="100%";b.parentNode.style.width="100%"}var U=Z(a,e);e=0;for(f=U.length;e<f;e++){x=v(a,e);U[e].style.width=a.aoColumns[x].sWidth}a.nTFoot!==null&&N(function(z){z.style.width=""},k);if(a.oScroll.bCollapse&&a.oScroll.sY!=="")d.style.height=d.offsetHeight+a.nTHead.offsetHeight+"px";e=i(a.nTable).outerWidth();if(a.oScroll.sX===""){a.nTable.style.width="100%";if(L&&(i("tbody",d).height()>d.offsetHeight||i(d).css("overflow-y")=="scroll"))a.nTable.style.width=t(i(a.nTable).outerWidth()-
|
||||||
|
a.oScroll.iBarWidth)}else if(a.oScroll.sXInner!=="")a.nTable.style.width=t(a.oScroll.sXInner);else if(e==i(d).width()&&i(d).height()<i(a.nTable).height()){a.nTable.style.width=t(e-a.oScroll.iBarWidth);if(i(a.nTable).outerWidth()>e-a.oScroll.iBarWidth)a.nTable.style.width=t(e)}else a.nTable.style.width=t(e);e=i(a.nTable).outerWidth();N(ja,j);N(function(z){y.push(t(i(z).width()))},j);N(function(z,Q){z.style.width=y[Q]},g);i(j).height(0);if(a.nTFoot!==null){N(ja,k);N(function(z){B.push(t(i(z).width()))},
|
||||||
|
k);N(function(z,Q){z.style.width=B[Q]},m);i(k).height(0)}N(function(z,Q){z.innerHTML="";z.style.width=y[Q]},j);a.nTFoot!==null&&N(function(z,Q){z.innerHTML="";z.style.width=B[Q]},k);if(i(a.nTable).outerWidth()<e){g=d.scrollHeight>d.offsetHeight||i(d).css("overflow-y")=="scroll"?e+a.oScroll.iBarWidth:e;if(L&&(d.scrollHeight>d.offsetHeight||i(d).css("overflow-y")=="scroll"))a.nTable.style.width=t(g-a.oScroll.iBarWidth);d.style.width=t(g);a.nScrollHead.style.width=t(g);if(a.nTFoot!==null)a.nScrollFoot.style.width=
|
||||||
|
t(g);if(a.oScroll.sX==="")O(a,1,"The table cannot fit into the current element which will cause column misalignment. The table has been drawn at its minimum possible width.");else a.oScroll.sXInner!==""&&O(a,1,"The table cannot fit into the current element which will cause column misalignment. Increase the sScrollXInner value or remove it to allow automatic calculation")}else{d.style.width=t("100%");a.nScrollHead.style.width=t("100%");if(a.nTFoot!==null)a.nScrollFoot.style.width=t("100%")}if(a.oScroll.sY===
|
||||||
|
"")if(L)d.style.height=t(a.nTable.offsetHeight+a.oScroll.iBarWidth);if(a.oScroll.sY!==""&&a.oScroll.bCollapse){d.style.height=t(a.oScroll.sY);L=a.oScroll.sX!==""&&a.nTable.offsetWidth>d.offsetWidth?a.oScroll.iBarWidth:0;if(a.nTable.offsetHeight<d.offsetHeight)d.style.height=t(a.nTable.offsetHeight+L)}L=i(a.nTable).outerWidth();c.style.width=t(L);b.style.width=t(L);c=i(a.nTable).height()>d.clientHeight||i(d).css("overflow-y")=="scroll";b.style.paddingRight=c?a.oScroll.iBarWidth+"px":"0px";if(a.nTFoot!==
|
||||||
|
null){M.style.width=t(L);T.style.width=t(L);T.style.paddingRight=c?a.oScroll.iBarWidth+"px":"0px"}i(d).scroll();if(a.bSorted||a.bFiltered)d.scrollTop=0}function N(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;){if(g.nodeType===1){c?a(g,j,d):a(g,d);d++}g=g.nextSibling;j=c?j.nextSibling:null}e++}}function ab(a,b){if(!a||a===null||a==="")return 0;if(!b)b=s.body;var c=s.createElement("div");c.style.width=t(a);b.appendChild(c);a=c.offsetWidth;b.removeChild(c);
|
||||||
|
return a}function ta(a){var b=0,c,d=0,e=a.aoColumns.length,f,g,j=i("th",a.nTHead),k=a.nTable.getAttribute("width");g=a.nTable.parentNode;for(f=0;f<e;f++)if(a.aoColumns[f].bVisible){d++;if(a.aoColumns[f].sWidth!==null){c=ab(a.aoColumns[f].sWidthOrig,g);if(c!==null)a.aoColumns[f].sWidth=t(c);b++}}if(e==j.length&&b===0&&d==e&&a.oScroll.sX===""&&a.oScroll.sY==="")for(f=0;f<a.aoColumns.length;f++){c=i(j[f]).width();if(c!==null)a.aoColumns[f].sWidth=t(c)}else{b=a.nTable.cloneNode(false);f=a.nTHead.cloneNode(true);
|
||||||
|
d=s.createElement("tbody");c=s.createElement("tr");b.removeAttribute("id");b.appendChild(f);if(a.nTFoot!==null){b.appendChild(a.nTFoot.cloneNode(true));N(function(u){u.style.width=""},b.getElementsByTagName("tr"))}b.appendChild(d);d.appendChild(c);d=i("thead th",b);if(d.length===0)d=i("tbody tr:eq(0)>td",b);j=Z(a,f);for(f=d=0;f<e;f++){var m=a.aoColumns[f];if(m.bVisible&&m.sWidthOrig!==null&&m.sWidthOrig!=="")j[f-d].style.width=t(m.sWidthOrig);else if(m.bVisible)j[f-d].style.width="";else d++}for(f=
|
||||||
|
0;f<e;f++)if(a.aoColumns[f].bVisible){d=bb(a,f);if(d!==null){d=d.cloneNode(true);if(a.aoColumns[f].sContentPadding!=="")d.innerHTML+=a.aoColumns[f].sContentPadding;c.appendChild(d)}}g.appendChild(b);if(a.oScroll.sX!==""&&a.oScroll.sXInner!=="")b.style.width=t(a.oScroll.sXInner);else if(a.oScroll.sX!==""){b.style.width="";if(i(b).width()<g.offsetWidth)b.style.width=t(g.offsetWidth)}else if(a.oScroll.sY!=="")b.style.width=t(g.offsetWidth);else if(k)b.style.width=t(k);b.style.visibility="hidden";cb(a,
|
||||||
|
b);e=i("tbody tr:eq(0)",b).children();if(e.length===0)e=Z(a,i("thead",b)[0]);if(a.oScroll.sX!==""){for(f=d=g=0;f<a.aoColumns.length;f++)if(a.aoColumns[f].bVisible){g+=a.aoColumns[f].sWidthOrig===null?i(e[d]).outerWidth():parseInt(a.aoColumns[f].sWidth.replace("px",""),10)+(i(e[d]).outerWidth()-i(e[d]).width());d++}b.style.width=t(g);a.nTable.style.width=t(g)}for(f=d=0;f<a.aoColumns.length;f++)if(a.aoColumns[f].bVisible){g=i(e[d]).width();if(g!==null&&g>0)a.aoColumns[f].sWidth=t(g);d++}e=i(b).css("width");
|
||||||
|
a.nTable.style.width=e.indexOf("%")!==-1?e:t(i(b).outerWidth());b.parentNode.removeChild(b)}if(k)a.nTable.style.width=t(k)}function cb(a,b){if(a.oScroll.sX===""&&a.oScroll.sY!==""){i(b).width();b.style.width=t(i(b).outerWidth()-a.oScroll.iBarWidth)}else if(a.oScroll.sX!=="")b.style.width=t(i(b).outerWidth())}function bb(a,b){var c=db(a,b);if(c<0)return null;if(a.aoData[c].nTr===null){var d=s.createElement("td");d.innerHTML=F(a,c,b,"");return d}return W(a,c)[b]}function db(a,b){for(var c=-1,d=-1,e=
|
||||||
|
0;e<a.aoData.length;e++){var f=F(a,e,b,"display")+"";f=f.replace(/<.*?>/g,"");if(f.length>c){c=f.length;d=e}}return d}function t(a){if(a===null)return"0px";if(typeof a=="number"){if(a<0)return"0px";return a+"px"}var b=a.charCodeAt(a.length-1);if(b<48||b>57)return a;return a+"px"}function eb(){var a=s.createElement("p"),b=a.style;b.width="100%";b.height="200px";b.padding="0px";var c=s.createElement("div");b=c.style;b.position="absolute";b.top="0px";b.left="0px";b.visibility="hidden";b.width="200px";
|
||||||
|
b.height="150px";b.padding="0px";b.overflow="hidden";c.appendChild(a);s.body.appendChild(c);b=a.offsetWidth;c.style.overflow="scroll";a=a.offsetWidth;if(b==a)a=c.clientWidth;s.body.removeChild(c);return b-a}function $(a,b){var c,d,e,f,g,j,k=[],m=[],u=l.ext.oSort,x=a.aoData,y=a.aoColumns,B=a.oLanguage.oAria;if(!a.oFeatures.bServerSide&&(a.aaSorting.length!==0||a.aaSortingFixed!==null)){k=a.aaSortingFixed!==null?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(c=0;c<k.length;c++){d=k[c][0];
|
||||||
|
e=w(a,d);f=a.aoColumns[d].sSortDataType;if(l.ext.afnSortData[f]){g=l.ext.afnSortData[f].call(a.oInstance,a,d,e);if(g.length===x.length){e=0;for(f=x.length;e<f;e++)S(a,e,d,g[e])}else O(a,0,"Returned data sort array (col "+d+") is the wrong length")}}c=0;for(d=a.aiDisplayMaster.length;c<d;c++)m[a.aiDisplayMaster[c]]=c;var T=k.length,M;c=0;for(d=x.length;c<d;c++)for(e=0;e<T;e++){M=y[k[e][0]].aDataSort;g=0;for(j=M.length;g<j;g++){f=y[M[g]].sType;f=u[(f?f:"string")+"-pre"];x[c]._aSortData[M[g]]=f?f(F(a,
|
||||||
|
c,M[g],"sort")):F(a,c,M[g],"sort")}}a.aiDisplayMaster.sort(function(L,ja){var U,z,Q,aa,ka;for(U=0;U<T;U++){ka=y[k[U][0]].aDataSort;z=0;for(Q=ka.length;z<Q;z++){aa=y[ka[z]].sType;aa=u[(aa?aa:"string")+"-"+k[U][1]](x[L]._aSortData[ka[z]],x[ja]._aSortData[ka[z]]);if(aa!==0)return aa}}return u["numeric-asc"](m[L],m[ja])})}if((b===p||b)&&!a.oFeatures.bDeferRender)ba(a);c=0;for(d=a.aoColumns.length;c<d;c++){e=y[c].sTitle.replace(/<.*?>/g,"");b=y[c].nTh;b.removeAttribute("aria-sort");b.removeAttribute("aria-label");
|
||||||
|
if(y[c].bSortable)if(k.length>0&&k[0][0]==c){b.setAttribute("aria-sort",k[0][1]=="asc"?"ascending":"descending");b.setAttribute("aria-label",e+((y[c].asSorting[k[0][2]+1]?y[c].asSorting[k[0][2]+1]:y[c].asSorting[0])=="asc"?B.sSortAscending:B.sSortDescending))}else b.setAttribute("aria-label",e+(y[c].asSorting[0]=="asc"?B.sSortAscending:B.sSortDescending));else b.setAttribute("aria-label",e)}a.bSorted=true;i(a.oInstance).trigger("sort",a);if(a.oFeatures.bFilter)X(a,a.oPreviousSearch,1);else{a.aiDisplay=
|
||||||
|
a.aiDisplayMaster.slice();a._iDisplayStart=0;I(a);H(a)}}function ya(a,b,c,d){fb(b,{},function(e){if(a.aoColumns[c].bSortable!==false){var f=function(){var g,j;if(e.shiftKey){for(var k=false,m=0;m<a.aaSorting.length;m++)if(a.aaSorting[m][0]==c){k=true;g=a.aaSorting[m][0];j=a.aaSorting[m][2]+1;if(a.aoColumns[g].asSorting[j]){a.aaSorting[m][1]=a.aoColumns[g].asSorting[j];a.aaSorting[m][2]=j}else a.aaSorting.splice(m,1);break}k===false&&a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0])}else if(a.aaSorting.length==
|
||||||
|
1&&a.aaSorting[0][0]==c){g=a.aaSorting[0][0];j=a.aaSorting[0][2]+1;a.aoColumns[g].asSorting[j]||(j=0);a.aaSorting[0][1]=a.aoColumns[g].asSorting[j];a.aaSorting[0][2]=j}else{a.aaSorting.splice(0,a.aaSorting.length);a.aaSorting.push([c,a.aoColumns[c].asSorting[0],0])}$(a)};if(a.oFeatures.bProcessing){P(a,true);setTimeout(function(){f();a.oFeatures.bServerSide||P(a,false)},0)}else f();typeof d=="function"&&d(a)}})}function ba(a){var b,c,d,e,f,g=a.aoColumns.length,j=a.oClasses;for(b=0;b<g;b++)a.aoColumns[b].bSortable&&
|
||||||
|
i(a.aoColumns[b].nTh).removeClass(j.sSortAsc+" "+j.sSortDesc+" "+a.aoColumns[b].sSortingClass);c=a.aaSortingFixed!==null?a.aaSortingFixed.concat(a.aaSorting):a.aaSorting.slice();for(b=0;b<a.aoColumns.length;b++)if(a.aoColumns[b].bSortable){f=a.aoColumns[b].sSortingClass;e=-1;for(d=0;d<c.length;d++)if(c[d][0]==b){f=c[d][1]=="asc"?j.sSortAsc:j.sSortDesc;e=d;break}i(a.aoColumns[b].nTh).addClass(f);if(a.bJUI){f=i("span."+j.sSortIcon,a.aoColumns[b].nTh);f.removeClass(j.sSortJUIAsc+" "+j.sSortJUIDesc+" "+
|
||||||
|
j.sSortJUI+" "+j.sSortJUIAscAllowed+" "+j.sSortJUIDescAllowed);f.addClass(e==-1?a.aoColumns[b].sSortingClassJUI:c[e][1]=="asc"?j.sSortJUIAsc:j.sSortJUIDesc)}}else i(a.aoColumns[b].nTh).addClass(a.aoColumns[b].sSortingClass);f=j.sSortColumn;if(a.oFeatures.bSort&&a.oFeatures.bSortClasses){a=W(a);e=[];for(b=0;b<g;b++)e.push("");b=0;for(d=1;b<c.length;b++){j=parseInt(c[b][0],10);e[j]=f+d;d<3&&d++}f=new RegExp(f+"[123]");var k;b=0;for(c=a.length;b<c;b++){j=b%g;d=a[b].className;k=e[j];j=d.replace(f,k);
|
||||||
|
if(j!=d)a[b].className=i.trim(j);else if(k.length>0&&d.indexOf(k)==-1)a[b].className=d+" "+k}}}function Ha(a){if(!(!a.oFeatures.bStateSave||a.bDestroying)){var b,c;b=a.oScroll.bInfinite;var d={iCreate:(new Date).getTime(),iStart:b?0:a._iDisplayStart,iEnd:b?a._iDisplayLength:a._iDisplayEnd,iLength:a._iDisplayLength,aaSorting:i.extend(true,[],a.aaSorting),oSearch:i.extend(true,{},a.oPreviousSearch),aoSearchCols:i.extend(true,[],a.aoPreSearchCols),abVisCols:[]};b=0;for(c=a.aoColumns.length;b<c;b++)d.abVisCols.push(a.aoColumns[b].bVisible);
|
||||||
|
K(a,"aoStateSaveParams","stateSaveParams",[a,d]);a.fnStateSave.call(a.oInstance,a,d)}}function gb(a,b){if(a.oFeatures.bStateSave){var c=a.fnStateLoad.call(a.oInstance,a);if(c){var d=K(a,"aoStateLoadParams","stateLoadParams",[a,c]);if(i.inArray(false,d)===-1){a.oLoadedState=i.extend(true,{},c);a._iDisplayStart=c.iStart;a.iInitDisplayStart=c.iStart;a._iDisplayEnd=c.iEnd;a._iDisplayLength=c.iLength;a.aaSorting=c.aaSorting.slice();a.saved_aaSorting=c.aaSorting.slice();i.extend(a.oPreviousSearch,c.oSearch);
|
||||||
|
i.extend(true,a.aoPreSearchCols,c.aoSearchCols);b.saved_aoColumns=[];for(d=0;d<c.abVisCols.length;d++){b.saved_aoColumns[d]={};b.saved_aoColumns[d].bVisible=c.abVisCols[d]}K(a,"aoStateLoaded","stateLoaded",[a,c])}}}}function lb(a,b,c,d,e){var f=new Date;f.setTime(f.getTime()+c*1E3);c=la.location.pathname.split("/");a=a+"_"+c.pop().replace(/[\/:]/g,"").toLowerCase();var g;if(e!==null){g=typeof i.parseJSON==="function"?i.parseJSON(b):eval("("+b+")");b=e(a,g,f.toGMTString(),c.join("/")+"/")}else b=a+
|
||||||
|
"="+encodeURIComponent(b)+"; expires="+f.toGMTString()+"; path="+c.join("/")+"/";a=s.cookie.split(";");e=b.split(";")[0].length;f=[];if(e+s.cookie.length+10>4096){for(var j=0,k=a.length;j<k;j++)if(a[j].indexOf(d)!=-1){var m=a[j].split("=");try{(g=eval("("+decodeURIComponent(m[1])+")"))&&g.iCreate&&f.push({name:m[0],time:g.iCreate})}catch(u){}}for(f.sort(function(x,y){return y.time-x.time});e+s.cookie.length+10>4096;){if(f.length===0)return;d=f.pop();s.cookie=d.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
|
||||||
|
c.join("/")+"/"}}s.cookie=b}function mb(a){var b=la.location.pathname.split("/");a=a+"_"+b[b.length-1].replace(/[\/:]/g,"").toLowerCase()+"=";b=s.cookie.split(";");for(var c=0;c<b.length;c++){for(var d=b[c];d.charAt(0)==" ";)d=d.substring(1,d.length);if(d.indexOf(a)===0)return decodeURIComponent(d.substring(a.length,d.length))}return null}function C(a){for(var b=0;b<l.settings.length;b++)if(l.settings[b].nTable===a)return l.settings[b];return null}function fa(a){var b=[];a=a.aoData;for(var c=0,d=
|
||||||
|
a.length;c<d;c++)a[c].nTr!==null&&b.push(a[c].nTr);return b}function W(a,b){var c=[],d,e,f,g,j;e=0;var k=a.aoData.length;if(b!==p){e=b;k=b+1}for(e=e;e<k;e++){j=a.aoData[e];if(j.nTr!==null){b=[];for(d=j.nTr.firstChild;d;){f=d.nodeName.toLowerCase();if(f=="td"||f=="th")b.push(d);d=d.nextSibling}f=d=0;for(g=a.aoColumns.length;f<g;f++)if(a.aoColumns[f].bVisible)c.push(b[f-d]);else{c.push(j._anHidden[f]);d++}}}return c}function O(a,b,c){a=a===null?"DataTables warning: "+c:"DataTables warning (table id = '"+
|
||||||
|
a.sTableId+"'): "+c;if(b===0)if(l.ext.sErrMode=="alert")alert(a);else throw new Error(a);else la.console&&console.log&&console.log(a)}function r(a,b,c,d){if(d===p)d=c;if(b[c]!==p)a[d]=b[c]}function hb(a,b){var c;for(var d in b)if(b.hasOwnProperty(d)){c=b[d];if(typeof h[d]==="object"&&c!==null&&i.isArray(c)===false)i.extend(true,a[d],c);else a[d]=c}return a}function fb(a,b,c){i(a).bind("click.DT",b,function(d){a.blur();c(d)}).bind("keypress.DT",b,function(d){d.which===13&&c(d)}).bind("selectstart.DT",
|
||||||
|
function(){return false})}function J(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function K(a,b,c,d){b=a[b];for(var e=[],f=b.length-1;f>=0;f--)e.push(b[f].fn.apply(a.oInstance,d));c!==null&&i(a.oInstance).trigger(c,d);return e}function ib(a){var b=i('<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden"><div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;"><div id="DT_BrowserTest" style="width:100%; height:10px;"></div></div></div>')[0];s.body.appendChild(b);
|
||||||
|
a.oBrowser.bScrollOversize=i("#DT_BrowserTest",b)[0].offsetWidth===100?true:false;s.body.removeChild(b)}function jb(a){return function(){var b=[C(this[l.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return l.ext.oApi[a].apply(this,b)}}var ga=/\[.*?\]$/,kb=la.JSON?JSON.stringify:function(a){var b=typeof a;if(b!=="object"||a===null){if(b==="string")a='"'+a+'"';return a+""}var c,d,e=[],f=i.isArray(a);for(c in a){d=a[c];b=typeof d;if(b==="string")d='"'+d+'"';else if(b==="object"&&d!==
|
||||||
|
null)d=kb(d);e.push((f?"":'"'+c+'":')+d)}return(f?"[":"{")+e+(f?"]":"}")};this.$=function(a,b){var c,d=[],e;c=C(this[l.ext.iApiIndex]);var f=c.aoData,g=c.aiDisplay,j=c.aiDisplayMaster;b||(b={});b=i.extend({},{filter:"none",order:"current",page:"all"},b);if(b.page=="current"){b=c._iDisplayStart;for(c=c.fnDisplayEnd();b<c;b++)(e=f[g[b]].nTr)&&d.push(e)}else if(b.order=="current"&&b.filter=="none"){b=0;for(c=j.length;b<c;b++)(e=f[j[b]].nTr)&&d.push(e)}else if(b.order=="current"&&b.filter=="applied"){b=
|
||||||
|
0;for(c=g.length;b<c;b++)(e=f[g[b]].nTr)&&d.push(e)}else if(b.order=="original"&&b.filter=="none"){b=0;for(c=f.length;b<c;b++)(e=f[b].nTr)&&d.push(e)}else if(b.order=="original"&&b.filter=="applied"){b=0;for(c=f.length;b<c;b++){e=f[b].nTr;i.inArray(b,g)!==-1&&e&&d.push(e)}}else O(c,1,"Unknown selection options");f=i(d);d=f.filter(a);a=f.find(a);return i([].concat(i.makeArray(d),i.makeArray(a)))};this._=function(a,b){var c=[],d=this.$(a,b);a=0;for(b=d.length;a<b;a++)c.push(this.fnGetData(d[a]));return c};
|
||||||
|
this.fnAddData=function(a,b){if(a.length===0)return[];var c=[],d,e=C(this[l.ext.iApiIndex]);if(typeof a[0]==="object"&&a[0]!==null)for(var f=0;f<a.length;f++){d=R(e,a[f]);if(d==-1)return c;c.push(d)}else{d=R(e,a);if(d==-1)return c;c.push(d)}e.aiDisplay=e.aiDisplayMaster.slice();if(b===p||b)qa(e);return c};this.fnAdjustColumnSizing=function(a){var b=C(this[l.ext.iApiIndex]);o(b);if(a===p||a)this.fnDraw(false);else if(b.oScroll.sX!==""||b.oScroll.sY!=="")this.oApi._fnScrollDraw(b)};this.fnClearTable=
|
||||||
|
function(a){var b=C(this[l.ext.iApiIndex]);wa(b);if(a===p||a)H(b)};this.fnClose=function(a){for(var b=C(this[l.ext.iApiIndex]),c=0;c<b.aoOpenRows.length;c++)if(b.aoOpenRows[c].nParent==a){(a=b.aoOpenRows[c].nTr.parentNode)&&a.removeChild(b.aoOpenRows[c].nTr);b.aoOpenRows.splice(c,1);return 0}return 1};this.fnDeleteRow=function(a,b,c){var d=C(this[l.ext.iApiIndex]),e,f;a=typeof a==="object"?V(d,a):a;var g=d.aoData.splice(a,1);e=0;for(f=d.aoData.length;e<f;e++)if(d.aoData[e].nTr!==null)d.aoData[e].nTr._DT_RowIndex=
|
||||||
|
e;e=i.inArray(a,d.aiDisplay);d.asDataSearch.splice(e,1);xa(d.aiDisplayMaster,a);xa(d.aiDisplay,a);typeof b==="function"&&b.call(this,d,g);if(d._iDisplayStart>=d.fnRecordsDisplay()){d._iDisplayStart-=d._iDisplayLength;if(d._iDisplayStart<0)d._iDisplayStart=0}if(c===p||c){I(d);H(d)}return g};this.fnDestroy=function(a){var b=C(this[l.ext.iApiIndex]),c=b.nTableWrapper.parentNode,d=b.nTBody,e,f;a=a===p?false:a;b.bDestroying=true;K(b,"aoDestroyCallback","destroy",[b]);if(!a){e=0;for(f=b.aoColumns.length;e<
|
||||||
|
f;e++)b.aoColumns[e].bVisible===false&&this.fnSetColumnVis(e,true)}i(b.nTableWrapper).find("*").andSelf().unbind(".DT");i("tbody>tr>td."+b.oClasses.sRowEmpty,b.nTable).parent().remove();if(b.nTable!=b.nTHead.parentNode){i(b.nTable).children("thead").remove();b.nTable.appendChild(b.nTHead)}if(b.nTFoot&&b.nTable!=b.nTFoot.parentNode){i(b.nTable).children("tfoot").remove();b.nTable.appendChild(b.nTFoot)}b.nTable.parentNode.removeChild(b.nTable);i(b.nTableWrapper).remove();b.aaSorting=[];b.aaSortingFixed=
|
||||||
|
[];ba(b);i(fa(b)).removeClass(b.asStripeClasses.join(" "));i("th, td",b.nTHead).removeClass([b.oClasses.sSortable,b.oClasses.sSortableAsc,b.oClasses.sSortableDesc,b.oClasses.sSortableNone].join(" "));if(b.bJUI){i("th span."+b.oClasses.sSortIcon+", td span."+b.oClasses.sSortIcon,b.nTHead).remove();i("th, td",b.nTHead).each(function(){var g=i("div."+b.oClasses.sSortJUIWrapper,this),j=g.contents();i(this).append(j);g.remove()})}if(!a&&b.nTableReinsertBefore)c.insertBefore(b.nTable,b.nTableReinsertBefore);
|
||||||
|
else a||c.appendChild(b.nTable);e=0;for(f=b.aoData.length;e<f;e++)b.aoData[e].nTr!==null&&d.appendChild(b.aoData[e].nTr);if(b.oFeatures.bAutoWidth===true)b.nTable.style.width=t(b.sDestroyWidth);if(f=b.asDestroyStripes.length){a=i(d).children("tr");for(e=0;e<f;e++)a.filter(":nth-child("+f+"n + "+e+")").addClass(b.asDestroyStripes[e])}e=0;for(f=l.settings.length;e<f;e++)l.settings[e]==b&&l.settings.splice(e,1);h=b=null};this.fnDraw=function(a){var b=C(this[l.ext.iApiIndex]);if(a===false){I(b);H(b)}else qa(b)};
|
||||||
|
this.fnFilter=function(a,b,c,d,e,f){var g=C(this[l.ext.iApiIndex]);if(g.oFeatures.bFilter){if(c===p||c===null)c=false;if(d===p||d===null)d=true;if(e===p||e===null)e=true;if(f===p||f===null)f=true;if(b===p||b===null){X(g,{sSearch:a+"",bRegex:c,bSmart:d,bCaseInsensitive:f},1);if(e&&g.aanFeatures.f){b=g.aanFeatures.f;c=0;for(d=b.length;c<d;c++)try{b[c]._DT_Input!=s.activeElement&&i(b[c]._DT_Input).val(a)}catch(j){i(b[c]._DT_Input).val(a)}}}else{i.extend(g.aoPreSearchCols[b],{sSearch:a+"",bRegex:c,bSmart:d,
|
||||||
|
bCaseInsensitive:f});X(g,g.oPreviousSearch,1)}}};this.fnGetData=function(a,b){var c=C(this[l.ext.iApiIndex]);if(a!==p){var d=a;if(typeof a==="object"){var e=a.nodeName.toLowerCase();if(e==="tr")d=V(c,a);else if(e==="td"){d=V(c,a.parentNode);b=va(c,d,a)}}if(b!==p)return F(c,d,b,"");return c.aoData[d]!==p?c.aoData[d]._aData:null}return oa(c)};this.fnGetNodes=function(a){var b=C(this[l.ext.iApiIndex]);if(a!==p)return b.aoData[a]!==p?b.aoData[a].nTr:null;return fa(b)};this.fnGetPosition=function(a){var b=
|
||||||
|
C(this[l.ext.iApiIndex]),c=a.nodeName.toUpperCase();if(c=="TR")return V(b,a);else if(c=="TD"||c=="TH"){c=V(b,a.parentNode);a=va(b,c,a);return[c,w(b,a),a]}return null};this.fnIsOpen=function(a){for(var b=C(this[l.ext.iApiIndex]),c=0;c<b.aoOpenRows.length;c++)if(b.aoOpenRows[c].nParent==a)return true;return false};this.fnOpen=function(a,b,c){var d=C(this[l.ext.iApiIndex]),e=fa(d);if(i.inArray(a,e)!==-1){this.fnClose(a);e=s.createElement("tr");var f=s.createElement("td");e.appendChild(f);f.className=
|
||||||
|
c;f.colSpan=D(d);if(typeof b==="string")f.innerHTML=b;else i(f).html(b);b=i("tr",d.nTBody);i.inArray(a,b)!=-1&&i(e).insertAfter(a);d.aoOpenRows.push({nTr:e,nParent:a});return e}};this.fnPageChange=function(a,b){var c=C(this[l.ext.iApiIndex]);Ga(c,a);I(c);if(b===p||b)H(c)};this.fnSetColumnVis=function(a,b,c){var d=C(this[l.ext.iApiIndex]),e,f,g=d.aoColumns,j=d.aoData,k,m;if(g[a].bVisible!=b){if(b){for(e=f=0;e<a;e++)g[e].bVisible&&f++;m=f>=D(d);if(!m)for(e=a;e<g.length;e++)if(g[e].bVisible){k=e;break}e=
|
||||||
|
0;for(f=j.length;e<f;e++)if(j[e].nTr!==null)m?j[e].nTr.appendChild(j[e]._anHidden[a]):j[e].nTr.insertBefore(j[e]._anHidden[a],W(d,e)[k])}else{e=0;for(f=j.length;e<f;e++)if(j[e].nTr!==null){k=W(d,e)[a];j[e]._anHidden[a]=k;k.parentNode.removeChild(k)}}g[a].bVisible=b;ia(d,d.aoHeader);d.nTFoot&&ia(d,d.aoFooter);e=0;for(f=d.aoOpenRows.length;e<f;e++)d.aoOpenRows[e].nTr.colSpan=D(d);if(c===p||c){o(d);H(d)}Ha(d)}};this.fnSettings=function(){return C(this[l.ext.iApiIndex])};this.fnSort=function(a){var b=
|
||||||
|
C(this[l.ext.iApiIndex]);b.aaSorting=a;$(b)};this.fnSortListener=function(a,b,c){ya(C(this[l.ext.iApiIndex]),a,b,c)};this.fnUpdate=function(a,b,c,d,e){var f=C(this[l.ext.iApiIndex]);b=typeof b==="object"?V(f,b):b;if(i.isArray(a)&&c===p){f.aoData[b]._aData=a.slice();for(c=0;c<f.aoColumns.length;c++)this.fnUpdate(F(f,b,c),b,c,false,false)}else if(i.isPlainObject(a)&&c===p){f.aoData[b]._aData=i.extend(true,{},a);for(c=0;c<f.aoColumns.length;c++)this.fnUpdate(F(f,b,c),b,c,false,false)}else{S(f,b,c,a);
|
||||||
|
a=F(f,b,c,"display");var g=f.aoColumns[c];if(g.fnRender!==null){a=da(f,b,c);g.bUseRendered&&S(f,b,c,a)}if(f.aoData[b].nTr!==null)W(f,b)[c].innerHTML=a}c=i.inArray(b,f.aiDisplay);f.asDataSearch[c]=Da(f,na(f,b,"filter",A(f,"bSearchable")));if(e===p||e)o(f);if(d===p||d)qa(f);return 0};this.fnVersionCheck=l.ext.fnVersionCheck;this.oApi={_fnExternApiFunc:jb,_fnInitialise:ra,_fnInitComplete:pa,_fnLanguageCompat:Fa,_fnAddColumn:n,_fnColumnOptions:q,_fnAddData:R,_fnCreateTr:ua,_fnGatherData:ea,_fnBuildHead:Ka,
|
||||||
|
_fnDrawHead:ia,_fnDraw:H,_fnReDraw:qa,_fnAjaxUpdate:La,_fnAjaxParameters:Ta,_fnAjaxUpdateDraw:Ua,_fnServerParams:Aa,_fnAddOptionsHtml:Ma,_fnFeatureHtmlTable:Qa,_fnScrollDraw:$a,_fnAdjustColumnSizing:o,_fnFeatureHtmlFilter:Oa,_fnFilterComplete:X,_fnFilterCustom:Xa,_fnFilterColumn:Wa,_fnFilter:Va,_fnBuildSearchArray:Ba,_fnBuildSearchRow:Da,_fnFilterCreateSearch:Ca,_fnDataToSearch:Ya,_fnSort:$,_fnSortAttachListener:ya,_fnSortingClasses:ba,_fnFeatureHtmlPaginate:Sa,_fnPageChange:Ga,_fnFeatureHtmlInfo:Ra,
|
||||||
|
_fnUpdateInfo:Za,_fnFeatureHtmlLength:Na,_fnFeatureHtmlProcessing:Pa,_fnProcessingDisplay:P,_fnVisibleToColumnIndex:v,_fnColumnIndexToVisible:w,_fnNodeToDataIndex:V,_fnVisbleColumns:D,_fnCalculateEnd:I,_fnConvertToWidth:ab,_fnCalculateColumnWidths:ta,_fnScrollingWidthAdjust:cb,_fnGetWidestNode:bb,_fnGetMaxLenString:db,_fnStringToCss:t,_fnDetectType:G,_fnSettingsFromNode:C,_fnGetDataMaster:oa,_fnGetTrNodes:fa,_fnGetTdNodes:W,_fnEscapeRegex:Ea,_fnDeleteIndex:xa,_fnReOrderIndex:E,_fnColumnOrdering:Y,
|
||||||
|
_fnLog:O,_fnClearTable:wa,_fnSaveState:Ha,_fnLoadState:gb,_fnCreateCookie:lb,_fnReadCookie:mb,_fnDetectHeader:ha,_fnGetUniqueThs:Z,_fnScrollBarWidth:eb,_fnApplyToChildren:N,_fnMap:r,_fnGetRowData:na,_fnGetCellData:F,_fnSetCellData:S,_fnGetObjectDataFn:ca,_fnSetObjectDataFn:Ja,_fnApplyColumnDefs:ma,_fnBindAction:fb,_fnExtend:hb,_fnCallbackReg:J,_fnCallbackFire:K,_fnJsonString:kb,_fnRender:da,_fnNodeToColumnIndex:va,_fnInfoMacros:za,_fnBrowserDetect:ib,_fnGetColumns:A};i.extend(l.ext.oApi,this.oApi);
|
||||||
|
for(var Ia in l.ext.oApi)if(Ia)this[Ia]=jb(Ia);var sa=this;this.each(function(){var a=0,b,c,d;c=this.getAttribute("id");var e=false,f=false;if(this.nodeName.toLowerCase()!="table")O(null,0,"Attempted to initialise DataTables on a node which is not a table: "+this.nodeName);else{a=0;for(b=l.settings.length;a<b;a++){if(l.settings[a].nTable==this)if(h===p||h.bRetrieve)return l.settings[a].oInstance;else if(h.bDestroy){l.settings[a].oInstance.fnDestroy();break}else{O(l.settings[a],0,"Cannot reinitialise DataTable.\n\nTo retrieve the DataTables object for this table, pass no arguments or see the docs for bRetrieve and bDestroy");
|
||||||
|
return}if(l.settings[a].sTableId==this.id){l.settings.splice(a,1);break}}if(c===null||c==="")this.id=c="DataTables_Table_"+l.ext._oExternConfig.iNextUnique++;var g=i.extend(true,{},l.models.oSettings,{nTable:this,oApi:sa.oApi,oInit:h,sDestroyWidth:i(this).width(),sInstance:c,sTableId:c});l.settings.push(g);g.oInstance=sa.length===1?sa:i(this).dataTable();h||(h={});h.oLanguage&&Fa(h.oLanguage);h=hb(i.extend(true,{},l.defaults),h);r(g.oFeatures,h,"bPaginate");r(g.oFeatures,h,"bLengthChange");r(g.oFeatures,
|
||||||
|
h,"bFilter");r(g.oFeatures,h,"bSort");r(g.oFeatures,h,"bInfo");r(g.oFeatures,h,"bProcessing");r(g.oFeatures,h,"bAutoWidth");r(g.oFeatures,h,"bSortClasses");r(g.oFeatures,h,"bServerSide");r(g.oFeatures,h,"bDeferRender");r(g.oScroll,h,"sScrollX","sX");r(g.oScroll,h,"sScrollXInner","sXInner");r(g.oScroll,h,"sScrollY","sY");r(g.oScroll,h,"bScrollCollapse","bCollapse");r(g.oScroll,h,"bScrollInfinite","bInfinite");r(g.oScroll,h,"iScrollLoadGap","iLoadGap");r(g.oScroll,h,"bScrollAutoCss","bAutoCss");r(g,
|
||||||
|
h,"asStripeClasses");r(g,h,"asStripClasses","asStripeClasses");r(g,h,"fnServerData");r(g,h,"fnFormatNumber");r(g,h,"sServerMethod");r(g,h,"aaSorting");r(g,h,"aaSortingFixed");r(g,h,"aLengthMenu");r(g,h,"sPaginationType");r(g,h,"sAjaxSource");r(g,h,"sAjaxDataProp");r(g,h,"iCookieDuration");r(g,h,"sCookiePrefix");r(g,h,"sDom");r(g,h,"bSortCellsTop");r(g,h,"iTabIndex");r(g,h,"oSearch","oPreviousSearch");r(g,h,"aoSearchCols","aoPreSearchCols");r(g,h,"iDisplayLength","_iDisplayLength");r(g,h,"bJQueryUI",
|
||||||
|
"bJUI");r(g,h,"fnCookieCallback");r(g,h,"fnStateLoad");r(g,h,"fnStateSave");r(g.oLanguage,h,"fnInfoCallback");J(g,"aoDrawCallback",h.fnDrawCallback,"user");J(g,"aoServerParams",h.fnServerParams,"user");J(g,"aoStateSaveParams",h.fnStateSaveParams,"user");J(g,"aoStateLoadParams",h.fnStateLoadParams,"user");J(g,"aoStateLoaded",h.fnStateLoaded,"user");J(g,"aoRowCallback",h.fnRowCallback,"user");J(g,"aoRowCreatedCallback",h.fnCreatedRow,"user");J(g,"aoHeaderCallback",h.fnHeaderCallback,"user");J(g,"aoFooterCallback",
|
||||||
|
h.fnFooterCallback,"user");J(g,"aoInitComplete",h.fnInitComplete,"user");J(g,"aoPreDrawCallback",h.fnPreDrawCallback,"user");if(g.oFeatures.bServerSide&&g.oFeatures.bSort&&g.oFeatures.bSortClasses)J(g,"aoDrawCallback",ba,"server_side_sort_classes");else g.oFeatures.bDeferRender&&J(g,"aoDrawCallback",ba,"defer_sort_classes");if(h.bJQueryUI){i.extend(g.oClasses,l.ext.oJUIClasses);if(h.sDom===l.defaults.sDom&&l.defaults.sDom==="lfrtip")g.sDom='<"H"lfr>t<"F"ip>'}else i.extend(g.oClasses,l.ext.oStdClasses);
|
||||||
|
i(this).addClass(g.oClasses.sTable);if(g.oScroll.sX!==""||g.oScroll.sY!=="")g.oScroll.iBarWidth=eb();if(g.iInitDisplayStart===p){g.iInitDisplayStart=h.iDisplayStart;g._iDisplayStart=h.iDisplayStart}if(h.bStateSave){g.oFeatures.bStateSave=true;gb(g,h);J(g,"aoDrawCallback",Ha,"state_save")}if(h.iDeferLoading!==null){g.bDeferLoading=true;a=i.isArray(h.iDeferLoading);g._iRecordsDisplay=a?h.iDeferLoading[0]:h.iDeferLoading;g._iRecordsTotal=a?h.iDeferLoading[1]:h.iDeferLoading}if(h.aaData!==null)f=true;
|
||||||
|
if(h.oLanguage.sUrl!==""){g.oLanguage.sUrl=h.oLanguage.sUrl;i.getJSON(g.oLanguage.sUrl,null,function(k){Fa(k);i.extend(true,g.oLanguage,h.oLanguage,k);ra(g)});e=true}else i.extend(true,g.oLanguage,h.oLanguage);if(h.asStripeClasses===null)g.asStripeClasses=[g.oClasses.sStripeOdd,g.oClasses.sStripeEven];b=g.asStripeClasses.length;g.asDestroyStripes=[];if(b){c=false;d=i(this).children("tbody").children("tr:lt("+b+")");for(a=0;a<b;a++)if(d.hasClass(g.asStripeClasses[a])){c=true;g.asDestroyStripes.push(g.asStripeClasses[a])}c&&
|
||||||
|
d.removeClass(g.asStripeClasses.join(" "))}c=[];a=this.getElementsByTagName("thead");if(a.length!==0){ha(g.aoHeader,a[0]);c=Z(g)}if(h.aoColumns===null){d=[];a=0;for(b=c.length;a<b;a++)d.push(null)}else d=h.aoColumns;a=0;for(b=d.length;a<b;a++){if(h.saved_aoColumns!==p&&h.saved_aoColumns.length==b){if(d[a]===null)d[a]={};d[a].bVisible=h.saved_aoColumns[a].bVisible}n(g,c?c[a]:null)}ma(g,h.aoColumnDefs,d,function(k,m){q(g,k,m)});a=0;for(b=g.aaSorting.length;a<b;a++){if(g.aaSorting[a][0]>=g.aoColumns.length)g.aaSorting[a][0]=
|
||||||
|
0;var j=g.aoColumns[g.aaSorting[a][0]];if(g.aaSorting[a][2]===p)g.aaSorting[a][2]=0;if(h.aaSorting===p&&g.saved_aaSorting===p)g.aaSorting[a][1]=j.asSorting[0];c=0;for(d=j.asSorting.length;c<d;c++)if(g.aaSorting[a][1]==j.asSorting[c]){g.aaSorting[a][2]=c;break}}ba(g);ib(g);a=i(this).children("caption").each(function(){this._captionSide=i(this).css("caption-side")});b=i(this).children("thead");if(b.length===0){b=[s.createElement("thead")];this.appendChild(b[0])}g.nTHead=b[0];b=i(this).children("tbody");
|
||||||
|
if(b.length===0){b=[s.createElement("tbody")];this.appendChild(b[0])}g.nTBody=b[0];g.nTBody.setAttribute("role","alert");g.nTBody.setAttribute("aria-live","polite");g.nTBody.setAttribute("aria-relevant","all");b=i(this).children("tfoot");if(b.length===0&&a.length>0&&(g.oScroll.sX!==""||g.oScroll.sY!=="")){b=[s.createElement("tfoot")];this.appendChild(b[0])}if(b.length>0){g.nTFoot=b[0];ha(g.aoFooter,g.nTFoot)}if(f)for(a=0;a<h.aaData.length;a++)R(g,h.aaData[a]);else ea(g);g.aiDisplay=g.aiDisplayMaster.slice();
|
||||||
|
g.bInitialised=true;e===false&&ra(g)}});sa=null;return this};l.fnVersionCheck=function(h){var n=function(A,G){for(;A.length<G;)A+="0";return A},q=l.ext.sVersion.split(".");h=h.split(".");for(var o="",v="",w=0,D=h.length;w<D;w++){o+=n(q[w],3);v+=n(h[w],3)}return parseInt(o,10)>=parseInt(v,10)};l.fnIsDataTable=function(h){for(var n=l.settings,q=0;q<n.length;q++)if(n[q].nTable===h||n[q].nScrollHead===h||n[q].nScrollFoot===h)return true;return false};l.fnTables=function(h){var n=[];jQuery.each(l.settings,
|
||||||
|
function(q,o){if(!h||h===true&&i(o.nTable).is(":visible"))n.push(o.nTable)});return n};l.version="1.9.4";l.settings=[];l.models={};l.models.ext={afnFiltering:[],afnSortData:[],aoFeatures:[],aTypes:[],fnVersionCheck:l.fnVersionCheck,iApiIndex:0,ofnSearch:{},oApi:{},oStdClasses:{},oJUIClasses:{},oPagination:{},oSort:{},sVersion:l.version,sErrMode:"alert",_oExternConfig:{iNextUnique:0}};l.models.oSearch={bCaseInsensitive:true,sSearch:"",bRegex:false,bSmart:true};l.models.oRow={nTr:null,_aData:[],_aSortData:[],
|
||||||
|
_anHidden:[],_sRowStripe:""};l.models.oColumn={aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bUseRendered:null,bVisible:null,_bAutoType:true,fnCreatedCell:null,fnGetData:null,fnRender:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};l.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:null,
|
||||||
|
aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:true,bDeferRender:false,bDestroy:false,bFilter:true,bInfo:true,bJQueryUI:false,bLengthChange:true,bPaginate:true,bProcessing:false,bRetrieve:false,bScrollAutoCss:true,bScrollCollapse:false,bScrollInfinite:false,bServerSide:false,bSort:true,bSortCellsTop:false,bSortClasses:true,bStateSave:false,fnCookieCallback:null,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(h){if(h<
|
||||||
|
1E3)return h;var n=h+"";h=n.split("");var q="";n=n.length;for(var o=0;o<n;o++){if(o%3===0&&o!==0)q=this.oLanguage.sInfoThousands+q;q=h[n-o-1]+q}return q},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:function(h,n,q,o){o.jqXHR=i.ajax({url:h,data:n,success:function(v){v.sError&&o.oApi._fnLog(o,0,v.sError);i(o.oInstance).trigger("xhr",[o,v]);q(v)},dataType:"json",cache:false,type:o.sServerMethod,error:function(v,w){w=="parsererror"&&
|
||||||
|
o.oApi._fnLog(o,0,"DataTables warning: JSON data from server could not be parsed. This is caused by a JSON formatting error.")}})},fnServerParams:null,fnStateLoad:function(h){h=this.oApi._fnReadCookie(h.sCookiePrefix+h.sInstance);var n;try{n=typeof i.parseJSON==="function"?i.parseJSON(h):eval("("+h+")")}catch(q){n=null}return n},fnStateLoadParams:null,fnStateLoaded:null,fnStateSave:function(h,n){this.oApi._fnCreateCookie(h.sCookiePrefix+h.sInstance,this.oApi._fnJsonString(n),h.iCookieDuration,h.sCookiePrefix,
|
||||||
|
h.fnCookieCallback)},fnStateSaveParams:null,iCookieDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iScrollLoadGap:100,iTabIndex:0,oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",
|
||||||
|
sInfoPostFix:"",sInfoThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sUrl:"",sZeroRecords:"No matching records found"},oSearch:i.extend({},l.models.oSearch),sAjaxDataProp:"aaData",sAjaxSource:null,sCookiePrefix:"SpryMedia_DataTables_",sDom:"lfrtip",sPaginationType:"two_button",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET"};l.defaults.columns={aDataSort:null,asSorting:["asc","desc"],bSearchable:true,bSortable:true,
|
||||||
|
bUseRendered:true,bVisible:true,fnCreatedCell:null,fnRender:null,iDataSort:-1,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};l.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortClasses:null,bStateSave:null},oScroll:{bAutoCss:null,bCollapse:null,bInfinite:null,iBarWidth:0,iLoadGap:null,
|
||||||
|
sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:false},aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],asDataSearch:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:null,asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],
|
||||||
|
aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:false,bInitialised:false,aoOpenRows:[],sDom:null,sPaginationType:"two_button",iCookieDuration:0,sCookiePrefix:"",fnCookieCallback:null,aoStateSave:[],aoStateLoad:[],oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:true,jqXHR:null,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:false,iDrawError:-1,_iDisplayLength:10,
|
||||||
|
_iDisplayStart:0,_iDisplayEnd:10,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:false,bSorted:false,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsTotal,10):this.aiDisplayMaster.length},fnRecordsDisplay:function(){return this.oFeatures.bServerSide?parseInt(this._iRecordsDisplay,10):this.aiDisplay.length},fnDisplayEnd:function(){return this.oFeatures.bServerSide?this.oFeatures.bPaginate===false||
|
||||||
|
this._iDisplayLength==-1?this._iDisplayStart+this.aiDisplay.length:Math.min(this._iDisplayStart+this._iDisplayLength,this._iRecordsDisplay):this._iDisplayEnd},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null};l.ext=i.extend(true,{},l.models.ext);i.extend(l.ext.oStdClasses,{sTable:"dataTable",sPagePrevEnabled:"paginate_enabled_previous",sPagePrevDisabled:"paginate_disabled_previous",sPageNextEnabled:"paginate_enabled_next",sPageNextDisabled:"paginate_disabled_next",sPageJUINext:"",
|
||||||
|
sPageJUIPrev:"",sPageButton:"paginate_button",sPageButtonActive:"paginate_active",sPageButtonStaticDisabled:"paginate_button paginate_button_disabled",sPageFirst:"first",sPagePrevious:"previous",sPageNext:"next",sPageLast:"last",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",
|
||||||
|
sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",
|
||||||
|
sFooterTH:"",sJUIHeader:"",sJUIFooter:""});i.extend(l.ext.oJUIClasses,l.ext.oStdClasses,{sPagePrevEnabled:"fg-button ui-button ui-state-default ui-corner-left",sPagePrevDisabled:"fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",sPageNextEnabled:"fg-button ui-button ui-state-default ui-corner-right",sPageNextDisabled:"fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",sPageJUINext:"ui-icon ui-icon-circle-arrow-e",sPageJUIPrev:"ui-icon ui-icon-circle-arrow-w",
|
||||||
|
sPageButton:"fg-button ui-button ui-state-default",sPageButtonActive:"fg-button ui-button ui-state-default ui-state-disabled",sPageButtonStaticDisabled:"fg-button ui-button ui-state-default ui-state-disabled",sPageFirst:"first ui-corner-tl ui-corner-bl",sPageLast:"last ui-corner-tr ui-corner-br",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:"ui-state-default",sSortDesc:"ui-state-default",sSortable:"ui-state-default",sSortableAsc:"ui-state-default",
|
||||||
|
sSortableDesc:"ui-state-default",sSortableNone:"ui-state-default",sSortJUIAsc:"css_right ui-icon ui-icon-triangle-1-n",sSortJUIDesc:"css_right ui-icon ui-icon-triangle-1-s",sSortJUI:"css_right ui-icon ui-icon-carat-2-n-s",sSortJUIAscAllowed:"css_right ui-icon ui-icon-carat-1-n",sSortJUIDescAllowed:"css_right ui-icon ui-icon-carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead ui-state-default",sScrollFoot:"dataTables_scrollFoot ui-state-default",
|
||||||
|
sFooterTH:"ui-state-default",sJUIHeader:"fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",sJUIFooter:"fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"});i.extend(l.ext.oPagination,{two_button:{fnInit:function(h,n,q){var o=h.oLanguage.oPaginate,v=function(D){h.oApi._fnPageChange(h,D.data.action)&&q(h)};o=!h.bJUI?'<a class="'+h.oClasses.sPagePrevDisabled+'" tabindex="'+h.iTabIndex+'" role="button">'+o.sPrevious+'</a><a class="'+
|
||||||
|
h.oClasses.sPageNextDisabled+'" tabindex="'+h.iTabIndex+'" role="button">'+o.sNext+"</a>":'<a class="'+h.oClasses.sPagePrevDisabled+'" tabindex="'+h.iTabIndex+'" role="button"><span class="'+h.oClasses.sPageJUIPrev+'"></span></a><a class="'+h.oClasses.sPageNextDisabled+'" tabindex="'+h.iTabIndex+'" role="button"><span class="'+h.oClasses.sPageJUINext+'"></span></a>';i(n).append(o);var w=i("a",n);o=w[0];w=w[1];h.oApi._fnBindAction(o,{action:"previous"},v);h.oApi._fnBindAction(w,{action:"next"},v);
|
||||||
|
if(!h.aanFeatures.p){n.id=h.sTableId+"_paginate";o.id=h.sTableId+"_previous";w.id=h.sTableId+"_next";o.setAttribute("aria-controls",h.sTableId);w.setAttribute("aria-controls",h.sTableId)}},fnUpdate:function(h){if(h.aanFeatures.p)for(var n=h.oClasses,q=h.aanFeatures.p,o,v=0,w=q.length;v<w;v++)if(o=q[v].firstChild){o.className=h._iDisplayStart===0?n.sPagePrevDisabled:n.sPagePrevEnabled;o=o.nextSibling;o.className=h.fnDisplayEnd()==h.fnRecordsDisplay()?n.sPageNextDisabled:n.sPageNextEnabled}}},iFullNumbersShowPages:5,
|
||||||
|
full_numbers:{fnInit:function(h,n,q){var o=h.oLanguage.oPaginate,v=h.oClasses,w=function(G){h.oApi._fnPageChange(h,G.data.action)&&q(h)};i(n).append('<a tabindex="'+h.iTabIndex+'" class="'+v.sPageButton+" "+v.sPageFirst+'">'+o.sFirst+'</a><a tabindex="'+h.iTabIndex+'" class="'+v.sPageButton+" "+v.sPagePrevious+'">'+o.sPrevious+'</a><span></span><a tabindex="'+h.iTabIndex+'" class="'+v.sPageButton+" "+v.sPageNext+'">'+o.sNext+'</a><a tabindex="'+h.iTabIndex+'" class="'+v.sPageButton+" "+v.sPageLast+
|
||||||
|
'">'+o.sLast+"</a>");var D=i("a",n);o=D[0];v=D[1];var A=D[2];D=D[3];h.oApi._fnBindAction(o,{action:"first"},w);h.oApi._fnBindAction(v,{action:"previous"},w);h.oApi._fnBindAction(A,{action:"next"},w);h.oApi._fnBindAction(D,{action:"last"},w);if(!h.aanFeatures.p){n.id=h.sTableId+"_paginate";o.id=h.sTableId+"_first";v.id=h.sTableId+"_previous";A.id=h.sTableId+"_next";D.id=h.sTableId+"_last"}},fnUpdate:function(h,n){if(h.aanFeatures.p){var q=l.ext.oPagination.iFullNumbersShowPages,o=Math.floor(q/2),v=
|
||||||
|
Math.ceil(h.fnRecordsDisplay()/h._iDisplayLength),w=Math.ceil(h._iDisplayStart/h._iDisplayLength)+1,D="",A,G=h.oClasses,E,Y=h.aanFeatures.p,ma=function(R){h.oApi._fnBindAction(this,{page:R+A-1},function(ea){h.oApi._fnPageChange(h,ea.data.page);n(h);ea.preventDefault()})};if(h._iDisplayLength===-1)w=o=A=1;else if(v<q){A=1;o=v}else if(w<=o){A=1;o=q}else if(w>=v-o){A=v-q+1;o=v}else{A=w-Math.ceil(q/2)+1;o=A+q-1}for(q=A;q<=o;q++)D+=w!==q?'<a tabindex="'+h.iTabIndex+'" class="'+G.sPageButton+'">'+h.fnFormatNumber(q)+
|
||||||
|
"</a>":'<a tabindex="'+h.iTabIndex+'" class="'+G.sPageButtonActive+'">'+h.fnFormatNumber(q)+"</a>";q=0;for(o=Y.length;q<o;q++){E=Y[q];if(E.hasChildNodes()){i("span:eq(0)",E).html(D).children("a").each(ma);E=E.getElementsByTagName("a");E=[E[0],E[1],E[E.length-2],E[E.length-1]];i(E).removeClass(G.sPageButton+" "+G.sPageButtonActive+" "+G.sPageButtonStaticDisabled);i([E[0],E[1]]).addClass(w==1?G.sPageButtonStaticDisabled:G.sPageButton);i([E[2],E[3]]).addClass(v===0||w===v||h._iDisplayLength===-1?G.sPageButtonStaticDisabled:
|
||||||
|
G.sPageButton)}}}}}});i.extend(l.ext.oSort,{"string-pre":function(h){if(typeof h!="string")h=h!==null&&h.toString?h.toString():"";return h.toLowerCase()},"string-asc":function(h,n){return h<n?-1:h>n?1:0},"string-desc":function(h,n){return h<n?1:h>n?-1:0},"html-pre":function(h){return h.replace(/<.*?>/g,"").toLowerCase()},"html-asc":function(h,n){return h<n?-1:h>n?1:0},"html-desc":function(h,n){return h<n?1:h>n?-1:0},"date-pre":function(h){h=Date.parse(h);if(isNaN(h)||h==="")h=Date.parse("01/01/1970 00:00:00");
|
||||||
|
return h},"date-asc":function(h,n){return h-n},"date-desc":function(h,n){return n-h},"numeric-pre":function(h){return h=="-"||h===""?0:h*1},"numeric-asc":function(h,n){return h-n},"numeric-desc":function(h,n){return n-h}});i.extend(l.ext.aTypes,[function(h){if(typeof h==="number")return"numeric";else if(typeof h!=="string")return null;var n,q=false;n=h.charAt(0);if("0123456789-".indexOf(n)==-1)return null;for(var o=1;o<h.length;o++){n=h.charAt(o);if("0123456789.".indexOf(n)==-1)return null;if(n==
|
||||||
|
"."){if(q)return null;q=true}}return"numeric"},function(h){var n=Date.parse(h);if(n!==null&&!isNaN(n)||typeof h==="string"&&h.length===0)return"date";return null},function(h){if(typeof h==="string"&&h.indexOf("<")!=-1&&h.indexOf(">")!=-1)return"html";return null}]);i.fn.DataTable=l;i.fn.dataTable=l;i.fn.dataTableSettings=l.settings;i.fn.dataTableExt=l.ext})})(window,document);
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -27,12 +27,13 @@
|
|||||||
import javax.xml.bind.annotation.XmlRootElement;
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
import com.google.inject.Singleton;
|
import com.google.inject.Singleton;
|
||||||
|
import org.apache.hadoop.http.JettyUtils;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Path("/ws/v1/test")
|
@Path("/ws/v1/test")
|
||||||
public class MyTestWebService {
|
public class MyTestWebService {
|
||||||
@GET
|
@GET
|
||||||
@Produces({ MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 })
|
||||||
public MyInfo get() {
|
public MyInfo get() {
|
||||||
return new MyInfo();
|
return new MyInfo();
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 'mvn dependency:analyze' fails to detect use of this dependency -->
|
<!-- 'mvn dependency:analyze' fails to detect use of this dependency -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user