From 5877f20f9c3f6f0afa505715e9a2ee312475af17 Mon Sep 17 00:00:00 2001 From: Robert Kanter Date: Thu, 27 Oct 2016 16:01:23 -0700 Subject: [PATCH] HADOOP-10075. Update jetty dependency to version 9 (rkanter) --- hadoop-client/pom.xml | 20 +- .../hadoop-auth-examples/pom.xml | 2 +- .../examples/RequestLoggerFilter.java | 12 + hadoop-common-project/hadoop-auth/pom.xml | 13 +- .../client/AuthenticatorTestCase.java | 27 +- hadoop-common-project/hadoop-common/pom.xml | 34 +- .../hadoop/http/AdminAuthorizedServlet.java | 2 +- .../apache/hadoop/http/HttpRequestLog.java | 4 +- .../org/apache/hadoop/http/HttpServer2.java | 303 +- .../org/apache/hadoop/http/JettyUtils.java | 35 + .../ssl/SslSelectChannelConnectorSecure.java | 58 - .../apache/hadoop/conf/TestConfServlet.java | 2 +- .../hadoop/fs/FSMainOperationsBaseTest.java | 4 +- .../fs/viewfs/ViewFileSystemTestSetup.java | 10 +- .../hadoop/fs/viewfs/ViewFsTestSetup.java | 10 +- .../http/TestAuthenticationSessionCookie.java | 11 +- .../hadoop/http/TestHttpRequestLog.java | 4 +- .../apache/hadoop/http/TestHttpServer.java | 22 +- .../apache/hadoop/http/TestServletFilter.java | 7 +- .../hadoop/http/resource/JerseyResource.java | 5 +- .../web/TestWebDelegationToken.java | 64 +- hadoop-common-project/hadoop-kms/pom.xml | 20 +- .../hadoop/crypto/key/kms/server/KMS.java | 21 +- .../kms/server/KMSAuthenticationFilter.java | 12 + .../crypto/key/kms/server/KMSJSONWriter.java | 3 +- .../hadoop/crypto/key/kms/server/MiniKMS.java | 63 +- hadoop-common-project/hadoop-nfs/pom.xml | 2 +- .../hadoop-hdfs-httpfs/pom.xml | 26 +- .../hadoop/fs/http/server/HttpFSServer.java | 12 +- .../hadoop/lib/wsrs/JSONMapProvider.java | 3 +- .../apache/hadoop/lib/wsrs/JSONProvider.java | 3 +- .../fs/http/client/BaseTestHttpFSWith.java | 6 +- .../fs/http/server/TestHttpFSServer.java | 6 +- .../http/server/TestHttpFSServerNoACLs.java | 6 +- .../http/server/TestHttpFSServerNoXAttrs.java | 6 +- .../http/server/TestHttpFSWithKerberos.java | 6 +- .../apache/hadoop/test/TestHFSTestCase.java | 8 +- .../org/apache/hadoop/test/TestHTestCase.java | 8 +- .../apache/hadoop/test/TestJettyHelper.java | 56 +- hadoop-hdfs-project/hadoop-hdfs-nfs/pom.xml | 8 +- hadoop-hdfs-project/hadoop-hdfs/pom.xml | 25 +- .../hdfs/qjournal/server/JournalNode.java | 2 +- .../hadoop/hdfs/server/datanode/DataNode.java | 2 +- .../hdfs/server/namenode/FSNamesystem.java | 2 +- .../hdfs/server/namenode/NNStorage.java | 2 +- .../hdfs/server/namenode/TransferFsImage.java | 2 +- .../web/resources/NamenodeWebHdfsMethods.java | 39 +- .../apache/hadoop/hdfs/TestDecommission.java | 2 +- .../server/TestJournalNodeMXBean.java | 2 +- .../blockmanagement/TestBlockStatsMXBean.java | 2 +- .../server/datanode/TestDataNodeMXBean.java | 2 +- .../namenode/TestFSNamesystemMBean.java | 2 +- .../server/namenode/TestNameNodeMXBean.java | 2 +- .../namenode/TestStartupProgressServlet.java | 2 +- .../server/namenode/TestTransferFsImage.java | 2 +- .../hadoop/hdfs/web/TestWebHDFSForHA.java | 2 +- .../hadoop/test/MiniDFSClusterManager.java | 2 +- .../mapreduce/v2/app/JobEndNotifier.java | 37 +- .../v2/app/webapp/AMWebServices.java | 49 +- .../v2/app/webapp/TestAMWebServices.java | 31 +- .../app/webapp/TestAMWebServicesAttempt.java | 13 +- .../app/webapp/TestAMWebServicesAttempts.java | 34 +- .../app/webapp/TestAMWebServicesJobConf.java | 13 +- .../v2/app/webapp/TestAMWebServicesJobs.java | 64 +- .../v2/app/webapp/TestAMWebServicesTasks.java | 61 +- .../mapreduce/v2/hs/webapp/HsWebServices.java | 40 +- .../v2/hs/webapp/TestHsWebServices.java | 25 +- .../hs/webapp/TestHsWebServicesAttempts.java | 34 +- .../hs/webapp/TestHsWebServicesJobConf.java | 13 +- .../v2/hs/webapp/TestHsWebServicesJobs.java | 67 +- .../hs/webapp/TestHsWebServicesJobsQuery.java | 76 +- .../v2/hs/webapp/TestHsWebServicesTasks.java | 61 +- .../hadoop/mapred/NotificationTestCase.java | 12 +- .../mapreduce/MiniHadoopClusterManager.java | 2 +- .../apache/hadoop/mapred/ShuffleHandler.java | 14 +- .../hadoop/mapred/TestShuffleHandler.java | 25 +- .../hadoop-mapreduce-client/pom.xml | 4 +- hadoop-mapreduce-project/pom.xml | 4 +- hadoop-maven-plugins/pom.xml | 4 + .../plugin/resourcegz/ResourceGzMojo.java | 125 + hadoop-project/pom.xml | 52 +- hadoop-tools/hadoop-azure-datalake/pom.xml | 2 +- hadoop-tools/hadoop-azure/pom.xml | 7 +- .../fs/azure/AzureNativeFileSystemStore.java | 2 +- .../fs/azure/BlockBlobAppendStream.java | 6 +- hadoop-tools/hadoop-sls/pom.xml | 10 +- .../apache/hadoop/yarn/sls/web/SLSWebApp.java | 19 +- .../yarn/client/api/impl/TestAMRMClient.java | 8 +- .../hadoop/yarn/client/cli/TestYarnCLI.java | 10 +- .../hadoop-yarn/hadoop-yarn-common/pom.xml | 17 +- .../dt-1.9.4/js/jquery.dataTables.min.js | 157 + .../dt-1.9.4/js/jquery.dataTables.min.js.gz | Bin 21726 -> 0 bytes .../webapps/static/jquery/jquery-1.8.2.min.js | 2 + .../static/jquery/jquery-1.8.2.min.js.gz | Bin 33430 -> 0 bytes .../jquery/jquery-ui-1.9.1.custom.min.js | 6 + .../jquery/jquery-ui-1.9.1.custom.min.js.gz | Bin 62855 -> 0 bytes .../webapps/static/jt/jquery.jstree.js | 4544 +++++++++++++++++ .../webapps/static/jt/jquery.jstree.js.gz | Bin 37540 -> 0 bytes .../hadoop/yarn/webapp/MyTestWebService.java | 3 +- .../pom.xml | 2 +- .../ApplicationHistoryServer.java | 50 +- .../webapp/AHSWebServices.java | 27 +- .../timeline/webapp/TimelineWebServices.java | 23 +- .../webapp/TestAHSWebServices.java | 22 +- .../TestRollingLevelDBTimelineStore.java | 6 +- .../webapp/TestTimelineWebServices.java | 141 +- .../hadoop-yarn-server-nodemanager/pom.xml | 4 +- .../nodemanager/webapp/NMWebServices.java | 28 +- .../amrmproxy/MockResourceManagerFacade.java | 11 +- .../TestLogAggregationService.java | 2 +- .../nodemanager/webapp/TestNMWebServices.java | 27 +- .../webapp/TestNMWebServicesApps.java | 49 +- .../webapp/TestNMWebServicesContainers.java | 25 +- .../pom.xml | 8 +- .../yarn/server/resourcemanager/RMNMInfo.java | 2 +- .../resourcemanager/webapp/RMWebServices.java | 121 +- .../yarn/server/resourcemanager/MockNM.java | 4 +- .../yarn/server/resourcemanager/TestRMHA.java | 4 +- .../planning/TestAlignedPlanner.java | 4 +- .../planning/TestGreedyReservationAgent.java | 4 +- .../webapp/TestRMWebServices.java | 46 +- .../webapp/TestRMWebServicesApps.java | 151 +- .../TestRMWebServicesAppsModification.java | 40 +- .../TestRMWebServicesCapacitySched.java | 19 +- .../TestRMWebServicesDelegationTokens.java | 4 +- .../TestRMWebServicesFairScheduler.java | 10 +- .../TestRMWebServicesForCSWithPartitions.java | 13 +- .../webapp/TestRMWebServicesNodeLabels.java | 55 +- .../webapp/TestRMWebServicesNodes.java | 58 +- .../webapp/TestRMWebServicesReservation.java | 13 +- .../TestRMWebServicesSchedulerActivities.java | 91 +- .../yarn/webapp/TestRMWithCSRFFilter.java | 7 +- .../pom.xml | 2 +- .../pom.xml | 16 + ...TimelineReaderWebServicesHBaseStorage.java | 50 +- .../pom.xml | 18 +- .../TimelineCollectorWebService.java | 4 +- .../reader/TimelineReaderServer.java | 25 +- .../reader/TimelineReaderWebServices.java | 47 +- .../reader/TestTimelineReaderWebServices.java | 73 +- .../hadoop-yarn-server-web-proxy/pom.xml | 6 +- .../webproxy/TestWebAppProxyServlet.java | 39 +- pom.xml | 3 +- 143 files changed, 6866 insertions(+), 1159 deletions(-) create mode 100644 hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/JettyUtils.java delete mode 100644 hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/ssl/SslSelectChannelConnectorSecure.java create mode 100644 hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/resourcegz/ResourceGzMojo.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/js/jquery.dataTables.min.js delete mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/js/jquery.dataTables.min.js.gz create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-1.8.2.min.js delete mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-1.8.2.min.js.gz create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-ui-1.9.1.custom.min.js delete mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-ui-1.9.1.custom.min.js.gz create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jt/jquery.jstree.js delete mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jt/jquery.jstree.js.gz diff --git a/hadoop-client/pom.xml b/hadoop-client/pom.xml index b330a3db4f..988dd03305 100644 --- a/hadoop-client/pom.xml +++ b/hadoop-client/pom.xml @@ -41,7 +41,7 @@ javax.servlet - servlet-api + javax.servlet-api commons-logging @@ -49,18 +49,18 @@ jetty - org.mortbay.jetty + org.eclipse.jetty - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server - org.mortbay.jetty + org.eclipse.jetty jetty-util - org.mortbay.jetty + org.eclipse.jetty servlet-api-2.5 @@ -112,8 +112,8 @@ avro - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server com.sun.jersey @@ -125,7 +125,7 @@ javax.servlet - servlet-api + javax.servlet-api @@ -137,7 +137,7 @@ javax.servlet - servlet-api + javax.servlet-api org.apache.hadoop diff --git a/hadoop-common-project/hadoop-auth-examples/pom.xml b/hadoop-common-project/hadoop-auth-examples/pom.xml index c36c157aa9..d841ace17c 100644 --- a/hadoop-common-project/hadoop-auth-examples/pom.xml +++ b/hadoop-common-project/hadoop-auth-examples/pom.xml @@ -34,7 +34,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/hadoop-common-project/hadoop-auth-examples/src/main/java/org/apache/hadoop/security/authentication/examples/RequestLoggerFilter.java b/hadoop-common-project/hadoop-auth-examples/src/main/java/org/apache/hadoop/security/authentication/examples/RequestLoggerFilter.java index a9721c9eba..80489917e0 100644 --- a/hadoop-common-project/hadoop-auth-examples/src/main/java/org/apache/hadoop/security/authentication/examples/RequestLoggerFilter.java +++ b/hadoop-common-project/hadoop-auth-examples/src/main/java/org/apache/hadoop/security/authentication/examples/RequestLoggerFilter.java @@ -139,7 +139,19 @@ public void setStatus(int 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 + @Deprecated + @SuppressWarnings("deprecation") public void setStatus(int sc, String msg) { super.setStatus(sc, msg); status = sc; diff --git a/hadoop-common-project/hadoop-auth/pom.xml b/hadoop-common-project/hadoop-auth/pom.xml index 0b37715227..5df4bdb647 100644 --- a/hadoop-common-project/hadoop-auth/pom.xml +++ b/hadoop-common-project/hadoop-auth/pom.xml @@ -53,13 +53,18 @@ test - org.mortbay.jetty + org.eclipse.jetty jetty-util test - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server + test + + + org.eclipse.jetty + jetty-servlet test @@ -74,7 +79,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java b/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java index 35e40d83f1..8b9d45e0e8 100644 --- a/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java +++ b/hadoop-common-project/hadoop-auth/src/test/java/org/apache/hadoop/security/authentication/client/AuthenticatorTestCase.java @@ -30,11 +30,14 @@ import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.servlet.Context; -import org.mortbay.jetty.servlet.FilterHolder; -import org.mortbay.jetty.servlet.ServletHolder; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +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.ServletException; import javax.servlet.http.HttpServlet; @@ -53,6 +56,7 @@ import java.net.ServerSocket; import java.net.URL; import java.security.Principal; +import java.util.EnumSet; import java.util.Properties; import org.junit.Assert; @@ -63,7 +67,7 @@ public class AuthenticatorTestCase { private int port = -1; private boolean useTomcat = false; private Tomcat tomcat = null; - Context context; + ServletContextHandler context; private static Properties authenticatorConfig; @@ -121,16 +125,19 @@ protected void start() throws Exception { } protected void startJetty() throws Exception { - server = new Server(0); - context = new Context(); + server = new Server(); + context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); host = "localhost"; port = getLocalPort(); - server.getConnectors()[0].setHost(host); - server.getConnectors()[0].setPort(port); + ServerConnector connector = new ServerConnector(server); + connector.setHost(host); + connector.setPort(port); + server.setConnectors(new Connector[] {connector}); server.start(); System.out.println("Running embedded servlet container at: http://" + host + ":" + port); } diff --git a/hadoop-common-project/hadoop-common/pom.xml b/hadoop-common-project/hadoop-common/pom.xml index fd9b7cd5ca..645d4951a0 100644 --- a/hadoop-common-project/hadoop-common/pom.xml +++ b/hadoop-common-project/hadoop-common/pom.xml @@ -93,24 +93,34 @@ javax.servlet - servlet-api + javax.servlet-api compile - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server compile - org.mortbay.jetty + org.eclipse.jetty jetty-util compile - org.mortbay.jetty - jetty-sslengine + org.eclipse.jetty + jetty-servlet compile + + org.eclipse.jetty + jetty-webapp + compile + + + org.eclipse.jetty + jetty-util-ajax + test + javax.servlet.jsp jsp-api @@ -412,6 +422,18 @@ ${project.build.directory}/generated-test-sources/java + + resource-gz + generate-resources + + resource-gz + + + ${basedir}/src/main/webapps/static + ${basedir}/target/webapps/static + js,css + + diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/AdminAuthorizedServlet.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/AdminAuthorizedServlet.java index ef562b41e6..a4b05a1d53 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/AdminAuthorizedServlet.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/AdminAuthorizedServlet.java @@ -23,7 +23,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.mortbay.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.DefaultServlet; /** * General servlet which is admin-authorized. diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpRequestLog.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpRequestLog.java index 52d985042a..a7c23b924c 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpRequestLog.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpRequestLog.java @@ -25,8 +25,8 @@ import org.apache.commons.logging.LogFactory; import org.apache.log4j.Appender; import org.apache.log4j.Logger; -import org.mortbay.jetty.NCSARequestLog; -import org.mortbay.jetty.RequestLog; +import org.eclipse.jetty.server.NCSARequestLog; +import org.eclipse.jetty.server.RequestLog; /** * RequestLog object for use with Http diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java index a2bb18f991..49ec90af5e 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java @@ -56,7 +56,6 @@ import org.apache.hadoop.fs.CommonConfigurationKeys; import org.apache.hadoop.security.AuthenticationFilterInitializer; 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.log.LogLevel; import org.apache.hadoop.security.SecurityUtil; @@ -65,34 +64,39 @@ import org.apache.hadoop.security.authorize.AccessControlList; import org.apache.hadoop.util.ReflectionUtils; import org.apache.hadoop.util.Shell; -import org.mortbay.io.Buffer; -import org.mortbay.jetty.Connector; -import org.mortbay.jetty.Handler; -import org.mortbay.jetty.MimeTypes; -import org.mortbay.jetty.RequestLog; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.SessionManager; -import org.mortbay.jetty.handler.ContextHandler; -import org.mortbay.jetty.handler.ContextHandlerCollection; -import org.mortbay.jetty.handler.HandlerCollection; -import org.mortbay.jetty.handler.RequestLogHandler; -import org.mortbay.jetty.nio.SelectChannelConnector; -import org.mortbay.jetty.security.SslSelectChannelConnector; -import org.mortbay.jetty.servlet.AbstractSessionManager; -import org.mortbay.jetty.servlet.Context; -import org.mortbay.jetty.servlet.DefaultServlet; -import org.mortbay.jetty.servlet.FilterHolder; -import org.mortbay.jetty.servlet.SessionHandler; -import org.mortbay.jetty.servlet.FilterMapping; -import org.mortbay.jetty.servlet.ServletHandler; -import org.mortbay.jetty.servlet.ServletHolder; -import org.mortbay.jetty.webapp.WebAppContext; -import org.mortbay.thread.QueuedThreadPool; -import org.mortbay.util.MultiException; +import org.eclipse.jetty.http.HttpVersion; +import org.eclipse.jetty.server.ConnectionFactory; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.RequestLog; +import org.eclipse.jetty.server.SecureRequestCustomizer; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.SessionManager; +import org.eclipse.jetty.server.SslConnectionFactory; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.RequestLogHandler; +import org.eclipse.jetty.server.session.AbstractSessionManager; +import org.eclipse.jetty.server.session.SessionHandler; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlet.FilterMapping; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; +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.collect.Lists; 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 @@ -126,11 +130,13 @@ public final class HttpServer2 implements FilterContainer { protected final Server webServer; - private final List listeners = Lists.newArrayList(); + private final HandlerCollection handlers; + + private final List listeners = Lists.newArrayList(); protected final WebAppContext webAppContext; protected final boolean findPort; - protected final Map defaultContexts = + private final Map defaultContexts = new HashMap<>(); protected final List filterNames = new ArrayList<>(); static final String STATE_DESCRIPTION_ALIVE = " - alive"; @@ -327,49 +333,59 @@ public HttpServer2 build() throws IOException { } for (URI ep : endpoints) { - final Connector listener; + final ServerConnector connector; String scheme = ep.getScheme(); if ("http".equals(scheme)) { - listener = HttpServer2.createDefaultChannelConnector(); + connector = + HttpServer2.createDefaultChannelConnector(server.webServer); } else if ("https".equals(scheme)) { - listener = createHttpsChannelConnector(); + connector = createHttpsChannelConnector(server.webServer); } else { throw new HadoopIllegalArgumentException( "unknown scheme for endpoint:" + ep); } - listener.setHost(ep.getHost()); - listener.setPort(ep.getPort() == -1 ? 0 : ep.getPort()); - server.addListener(listener); + connector.setHost(ep.getHost()); + connector.setPort(ep.getPort() == -1 ? 0 : ep.getPort()); + server.addListener(connector); } server.loadListeners(); return server; } - private Connector createHttpsChannelConnector() { - SslSelectChannelConnector c = new SslSelectChannelConnectorSecure(); - configureChannelConnector(c); - - c.setNeedClientAuth(needsClientAuth); - c.setKeyPassword(keyPassword); + private ServerConnector createHttpsChannelConnector(Server server) { + ServerConnector conn = new ServerConnector(server); + HttpConfiguration httpConfig = new HttpConfiguration(); + httpConfig.setRequestHeaderSize(JettyUtils.HEADER_SIZE); + httpConfig.setResponseHeaderSize(JettyUtils.HEADER_SIZE); + 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) { - c.setKeystore(keyStore); - c.setKeystoreType(keyStoreType); - c.setPassword(keyStorePassword); + sslContextFactory.setKeyStorePath(keyStore); + sslContextFactory.setKeyStoreType(keyStoreType); + sslContextFactory.setKeyStorePassword(keyStorePassword); } - if (trustStore != null) { - c.setTruststore(trustStore); - c.setTruststoreType(trustStoreType); - c.setTrustPassword(trustStorePassword); + sslContextFactory.setTrustStorePath(trustStore); + sslContextFactory.setTrustStoreType(trustStoreType); + sslContextFactory.setTrustStorePassword(trustStorePassword); } - if(null != excludeCiphers && !excludeCiphers.isEmpty()) { - c.setExcludeCipherSuites(excludeCiphers.split(",")); + sslContextFactory.setExcludeCipherSuites(excludeCiphers.split(",")); 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); this.webServer = new Server(); this.adminsAcl = b.adminsAcl; + this.handlers = new HandlerCollection(); this.webAppContext = createWebAppContext(b.name, b.conf, adminsAcl, appDir); this.xFrameOptionIsEnabled = b.xFrameEnabled; this.xFrameOption = b.xFrameOption; @@ -406,36 +423,33 @@ private void initializeWebServer(String name, String hostName, int maxThreads = conf.getInt(HTTP_MAX_THREADS, -1); // If HTTP_MAX_THREADS is not configured, QueueThreadPool() will use the // default value (currently 250). - QueuedThreadPool threadPool = maxThreads == -1 ? new QueuedThreadPool() - : new QueuedThreadPool(maxThreads); + + QueuedThreadPool threadPool = (QueuedThreadPool) webServer.getThreadPool(); threadPool.setDaemon(true); - webServer.setThreadPool(threadPool); + if (maxThreads != -1) { + threadPool.setMaxThreads(maxThreads); + } SessionManager sm = webAppContext.getSessionHandler().getSessionManager(); if (sm instanceof AbstractSessionManager) { AbstractSessionManager asm = (AbstractSessionManager)sm; asm.setHttpOnly(true); - asm.setSecureCookies(true); + asm.getSessionCookieConfig().setSecure(true); } ContextHandlerCollection contexts = new ContextHandlerCollection(); RequestLog requestLog = HttpRequestLog.getRequestLog(name); + handlers.addHandler(contexts); if (requestLog != null) { RequestLogHandler requestLogHandler = new RequestLogHandler(); requestLogHandler.setRequestLog(requestLog); - HandlerCollection handlers = new HandlerCollection(); - handlers.setHandlers(new Handler[] {contexts, requestLogHandler}); - webServer.setHandler(handlers); - } else { - webServer.setHandler(contexts); + handlers.addHandler(requestLogHandler); } - + handlers.addHandler(webAppContext); final String appDir = getWebAppsPath(name); - - webServer.addHandler(webAppContext); - addDefaultApps(contexts, appDir, conf); + webServer.setHandler(handlers); Map xFrameParams = new HashMap<>(); 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); } @@ -507,16 +521,14 @@ private static Properties getFilterProperties(Configuration conf, String return prop; } - private static void addNoCacheFilter(WebAppContext ctxt) { + private static void addNoCacheFilter(ServletContextHandler ctxt) { defineFilter(ctxt, NO_CACHE_FILTER, NoCacheFilter.class.getName(), Collections. emptyMap(), new String[] { "/*" }); } - private static void configureChannelConnector(SelectChannelConnector c) { - c.setLowResourceMaxIdleTime(10000); + private static void configureChannelConnector(ServerConnector c) { + c.setIdleTimeout(10000); c.setAcceptQueueSize(128); - c.setResolveNames(false); - c.setUseDirectBuffers(false); if(Shell.WINDOWS) { // result of setting the SO_REUSEADDR flag is different on Windows // 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 c.setReuseAddress(false); } - c.setHeaderBufferSize(1024*64); } @InterfaceAudience.Private - public static Connector createDefaultChannelConnector() { - SelectChannelConnector ret = new SelectChannelConnector(); - configureChannelConnector(ret); - return ret; + public static ServerConnector createDefaultChannelConnector(Server server) { + ServerConnector conn = new ServerConnector(server); + HttpConfiguration httpConfig = new HttpConfiguration(); + 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 */ @@ -567,7 +583,8 @@ protected void addDefaultApps(ContextHandlerCollection parent, CommonConfigurationKeys.HADOOP_HTTP_LOGS_ENABLED, CommonConfigurationKeys.HADOOP_HTTP_LOGS_ENABLED_DEFAULT); if (logDir != null && logsEnabled) { - Context logContext = new Context(parent, "/logs"); + ServletContextHandler logContext = + new ServletContextHandler(parent, "/logs"); logContext.setResourceBase(logDir); logContext.addServlet(AdminAuthorizedServlet.class, "/*"); if (conf.getBoolean( @@ -575,8 +592,7 @@ protected void addDefaultApps(ContextHandlerCollection parent, CommonConfigurationKeys.DEFAULT_HADOOP_JETTY_LOGS_SERVE_ALIASES)) { @SuppressWarnings("unchecked") Map params = logContext.getInitParams(); - params.put( - "org.mortbay.jetty.servlet.Default.aliases", "true"); + params.put("org.eclipse.jetty.servlet.Default.aliases", "true"); } logContext.setDisplayName("logs"); SessionHandler handler = new SessionHandler(); @@ -584,34 +600,37 @@ protected void addDefaultApps(ContextHandlerCollection parent, if (sm instanceof AbstractSessionManager) { AbstractSessionManager asm = (AbstractSessionManager) sm; asm.setHttpOnly(true); - asm.setSecureCookies(true); + asm.getSessionCookieConfig().setSecure(true); } logContext.setSessionHandler(handler); setContextAttributes(logContext, conf); - addNoCacheFilter(webAppContext); + addNoCacheFilter(logContext); defaultContexts.put(logContext, true); } // set up the context for "/static/*" - Context staticContext = new Context(parent, "/static"); + ServletContextHandler staticContext = + new ServletContextHandler(parent, "/static"); staticContext.setResourceBase(appDir + "/static"); staticContext.addServlet(DefaultServlet.class, "/*"); staticContext.setDisplayName("static"); @SuppressWarnings("unchecked") Map 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(); SessionManager sm = handler.getSessionManager(); if (sm instanceof AbstractSessionManager) { AbstractSessionManager asm = (AbstractSessionManager) sm; asm.setHttpOnly(true); - asm.setSecureCookies(true); + asm.getSessionCookieConfig().setSecure(true); } staticContext.setSessionHandler(handler); setContextAttributes(staticContext, conf); 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(ADMINS_ACL, adminsAcl); } @@ -627,9 +646,9 @@ protected void addDefaultServlets() { addServlet("conf", "/conf", ConfServlet.class); } - public void addContext(Context ctxt, boolean isFiltered) { - webServer.addHandler(ctxt); - addNoCacheFilter(webAppContext); + public void addContext(ServletContextHandler ctxt, boolean isFiltered) { + handlers.addHandler(ctxt); + addNoCacheFilter(ctxt); defaultContexts.put(ctxt, isFiltered); } @@ -691,7 +710,7 @@ public void addInternalServlet(String name, String pathSpec, * protect with Kerberos authentication. * Note: This method is to be used for adding servlets that facilitate * 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. * * @param name The name of the servlet (can be passed as null) @@ -705,19 +724,58 @@ public void addInternalServlet(String name, String pathSpec, if (name != null) { 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); if(requireAuth && UserGroupInformation.isSecurityEnabled()) { - LOG.info("Adding Kerberos (SPNEGO) filter to " + name); - ServletHandler handler = webAppContext.getServletHandler(); - FilterMapping fmap = new FilterMapping(); - fmap.setPathSpec(pathSpec); - fmap.setFilterName(SPNEGO_FILTER); - fmap.setDispatches(Handler.ALL); - handler.addFilterMapping(fmap); + LOG.info("Adding Kerberos (SPNEGO) filter to " + name); + ServletHandler handler = webAppContext.getServletHandler(); + FilterMapping fmap = new FilterMapping(); + fmap.setPathSpec(pathSpec); + fmap.setFilterName(SPNEGO_FILTER); + fmap.setDispatches(FilterMapping.ALL); + 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 public void addFilter(String name, String classname, Map parameters) { @@ -727,12 +785,14 @@ public void addFilter(String name, String classname, FilterMapping fmap = getFilterMapping(name, USER_FACING_URLS); defineFilter(webAppContext, filterHolder, fmap); LOG.info( - "Added filter " + name + " (class=" + classname + ") to context " + webAppContext.getDisplayName()); + "Added filter " + name + " (class=" + classname + ") to context " + + webAppContext.getDisplayName()); final String[] ALL_URLS = { "/*" }; fmap = getFilterMapping(name, ALL_URLS); - for (Map.Entry e : defaultContexts.entrySet()) { + for (Map.Entry e + : defaultContexts.entrySet()) { if (e.getValue()) { - Context ctx = e.getKey(); + ServletContextHandler ctx = e.getKey(); defineFilter(ctx, filterHolder, fmap); LOG.info("Added filter " + name + " (class=" + classname + ") to context " + ctx.getDisplayName()); @@ -748,7 +808,7 @@ public void addGlobalFilter(String name, String classname, FilterHolder filterHolder = getFilterHolder(name, classname, parameters); FilterMapping fmap = getFilterMapping(name, ALL_URLS); defineFilter(webAppContext, filterHolder, fmap); - for (Context ctx : defaultContexts.keySet()) { + for (ServletContextHandler ctx : defaultContexts.keySet()) { defineFilter(ctx, filterHolder, fmap); } 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. */ - public static void defineFilter(Context ctx, String name, + public static void defineFilter(ServletContextHandler ctx, String name, String classname, Map parameters, String[] urls) { FilterHolder filterHolder = getFilterHolder(name, classname, parameters); 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. */ - private static void defineFilter(Context ctx, FilterHolder holder, - FilterMapping fmap) { + private static void defineFilter(ServletContextHandler ctx, + FilterHolder holder, FilterMapping fmap) { ServletHandler handler = ctx.getServletHandler(); handler.addFilter(holder, fmap); } @@ -776,7 +836,7 @@ private static void defineFilter(Context ctx, FilterHolder holder, private static FilterMapping getFilterMapping(String name, String[] urls) { FilterMapping fmap = new FilterMapping(); fmap.setPathSpecs(urls); - fmap.setDispatches(Handler.ALL); + fmap.setDispatches(FilterMapping.ALL); fmap.setFilterName(name); return fmap; } @@ -786,7 +846,9 @@ private static FilterHolder getFilterHolder(String name, String classname, FilterHolder holder = new FilterHolder(); holder.setName(name); holder.setClassName(classname); - holder.setInitParameters(parameters); + if (parameters != null) { + holder.setInitParameters(parameters); + } return holder; } @@ -796,13 +858,13 @@ private static FilterHolder getFilterHolder(String name, String classname, * @param webAppCtx The WebApplicationContext to add to */ protected void addFilterPathMapping(String pathSpec, - Context webAppCtx) { + ServletContextHandler webAppCtx) { ServletHandler handler = webAppCtx.getServletHandler(); for(String name : filterNames) { FilterMapping fmap = new FilterMapping(); fmap.setPathSpec(pathSpec); fmap.setFilterName(name); - fmap.setDispatches(Handler.ALL); + fmap.setDispatches(FilterMapping.ALL); handler.addFilterMapping(fmap); } } @@ -841,23 +903,23 @@ protected String getWebAppsPath(String appName) throws FileNotFoundException { */ @Deprecated public int getPort() { - return webServer.getConnectors()[0].getLocalPort(); + return ((ServerConnector)webServer.getConnectors()[0]).getLocalPort(); } /** * Get the address that corresponds to a particular connector. * * @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) { Preconditions.checkArgument(index >= 0); if (index > webServer.getConnectors().length) return null; - Connector c = webServer.getConnectors()[index]; - if (c.getLocalPort() == -1) { - // The connector is not bounded + ServerConnector c = (ServerConnector)webServer.getConnectors()[index]; + if (c.getLocalPort() == -1 || c.getLocalPort() == -2) { + // The connector is not bounded or was closed return null; } @@ -907,8 +969,8 @@ public void start() throws IOException { throw ex; } // Make sure there is no handler failures. - Handler[] handlers = webServer.getHandlers(); - for (Handler handler : handlers) { + Handler[] hs = webServer.getHandlers(); + for (Handler handler : hs) { if (handler.isFailed()) { throw new IOException( "Problem in starting http server. Server handlers failed"); @@ -944,9 +1006,10 @@ private void loadListeners() { * @throws Exception */ void openListeners() throws Exception { - for (Connector listener : listeners) { - if (listener.getLocalPort() != -1) { - // This listener is either started externally or has been bound + for (ServerConnector listener : listeners) { + if (listener.getLocalPort() != -1 && listener.getLocalPort() != -2) { + // This listener is either started externally or has been bound or was + // closed continue; } int port = listener.getPort(); @@ -978,7 +1041,7 @@ void openListeners() throws Exception { */ public void stop() throws Exception { MultiException exception = null; - for (Connector c : listeners) { + for (ServerConnector c : listeners) { try { c.close(); } catch (Exception e) { @@ -1042,7 +1105,7 @@ public String toString() { .append(isAlive() ? STATE_DESCRIPTION_ALIVE : STATE_DESCRIPTION_NOT_LIVE) .append("), listening at:"); - for (Connector l : listeners) { + for (ServerConnector l : listeners) { sb.append(l.getHost()).append(":").append(l.getPort()).append("/,"); } return sb.toString(); @@ -1300,10 +1363,10 @@ public void doFilter(ServletRequest request, */ private String inferMimeType(ServletRequest request) { String path = ((HttpServletRequest)request).getRequestURI(); - ContextHandler.SContext sContext = (ContextHandler.SContext)config.getServletContext(); - MimeTypes mimes = sContext.getContextHandler().getMimeTypes(); - Buffer mimeBuffer = mimes.getMimeByExtension(path); - return (mimeBuffer == null) ? null : mimeBuffer.toString(); + ServletContextHandler.Context sContext = + (ServletContextHandler.Context)config.getServletContext(); + String mime = sContext.getMimeType(path); + return (mime == null) ? null : mime; } } diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/JettyUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/JettyUtils.java new file mode 100644 index 0000000000..29c0930968 --- /dev/null +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/JettyUtils.java @@ -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() { + } +} diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/ssl/SslSelectChannelConnectorSecure.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/ssl/SslSelectChannelConnectorSecure.java deleted file mode 100644 index 7de689b54b..0000000000 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/ssl/SslSelectChannelConnectorSecure.java +++ /dev/null @@ -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 nonSSLProtocols = new ArrayList(); - for (String p : engine.getEnabledProtocols()) { - if (!p.contains("SSLv3")) { - nonSSLProtocols.add(p); - } - } - engine.setEnabledProtocols(nonSSLProtocols.toArray( - new String[nonSSLProtocols.size()])); - return engine; - } -} diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfServlet.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfServlet.java index 60035be94d..53089ed6b3 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfServlet.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfServlet.java @@ -31,7 +31,7 @@ import javax.xml.parsers.DocumentBuilder; 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.Element; import org.w3c.dom.Node; diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/FSMainOperationsBaseTest.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/FSMainOperationsBaseTest.java index 35fd9be0c4..f0c00c4cde 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/FSMainOperationsBaseTest.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/FSMainOperationsBaseTest.java @@ -32,7 +32,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.mortbay.log.Log; +import org.eclipse.jetty.util.log.Log; /** *

@@ -797,7 +797,7 @@ public void testRenameNonExistentPath() throws Exception { rename(src, dst, false, false, false, Rename.NONE); Assert.fail("Should throw FileNotFoundException"); } catch (IOException e) { - Log.info("XXX", e); + Log.getLog().info("XXX", e); Assert.assertTrue(unwrapException(e) instanceof FileNotFoundException); } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFileSystemTestSetup.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFileSystemTestSetup.java index 81ca2106b8..866c03ecda 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFileSystemTestSetup.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFileSystemTestSetup.java @@ -27,7 +27,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.viewfs.ConfigUtil; 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); 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; } @@ -118,12 +118,12 @@ static void setUpHomeDir(Configuration conf, FileSystem fsTarget) { } else { // home dir is at root. Just link the home dir itse URI linkTarget = fsTarget.makeQualified(new Path(homeDir)).toUri(); 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 String homeDirRoot = fsTarget.getHomeDirectory().getParent().toUri().getPath(); 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); URI linkTarget = fsTarget.makeQualified(new Path(firstComponent)).toUri(); ConfigUtil.addLink(conf, firstComponent, linkTarget); - Log.info("Added link for " + info + " " + Log.getLog().info("Added link for " + info + " " + firstComponent + "->" + linkTarget); } } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsTestSetup.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsTestSetup.java index 92bcbc3464..9b7e17f4a6 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsTestSetup.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/viewfs/ViewFsTestSetup.java @@ -26,7 +26,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.viewfs.ConfigUtil; 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); 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("TargetOfTests = "+ targetOfTests.toUri()); 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 URI linkTarget = fsTarget.makeQualified(new Path(homeDir)).toUri(); 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 String homeDirRoot = fsTarget.getHomeDirectory().getParent().toUri().getPath(); 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); URI linkTarget = fsTarget.makeQualified(new Path(firstComponent)).toUri(); ConfigUtil.addLink(conf, firstComponent, linkTarget); - Log.info("Added link for " + info + " " + Log.getLog().info("Added link for " + info + " " + firstComponent + "->" + linkTarget); } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestAuthenticationSessionCookie.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestAuthenticationSessionCookie.java index c51f1e8414..44338dae9c 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestAuthenticationSessionCookie.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestAuthenticationSessionCookie.java @@ -22,7 +22,7 @@ import org.apache.hadoop.test.GenericTestUtils; import org.junit.After; import org.junit.Test; -import org.mortbay.log.Log; +import org.eclipse.jetty.util.log.Log; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; @@ -33,6 +33,7 @@ import java.net.URI; import java.net.URL; import java.net.HttpCookie; +import java.util.HashMap; import java.util.List; public class TestAuthenticationSessionCookie { @@ -71,7 +72,7 @@ public static class DummyFilterInitializer extends FilterInitializer { @Override public void initFilter(FilterContainer container, Configuration conf) { container.addFilter("DummyAuth", DummyAuthenticationFilter.class - .getName(), null); + .getName(), new HashMap<>()); } } @@ -93,7 +94,7 @@ public static class Dummy2FilterInitializer extends FilterInitializer { @Override public void initFilter(FilterContainer container, Configuration conf) { 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"); List cookies = HttpCookie.parse(header); Assert.assertTrue(!cookies.isEmpty()); - Log.info(header); + Log.getLog().info(header); Assert.assertFalse(header.contains("; Expires=")); Assert.assertTrue("token".equals(cookies.get(0).getValue())); } @@ -171,7 +172,7 @@ public void testPersistentCookie() throws IOException { String header = conn.getHeaderField("Set-Cookie"); List cookies = HttpCookie.parse(header); Assert.assertTrue(!cookies.isEmpty()); - Log.info(header); + Log.getLog().info(header); Assert.assertTrue(header.contains("; Expires=")); Assert.assertTrue("token".equals(cookies.get(0).getValue())); } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpRequestLog.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpRequestLog.java index 23e0d3e8a1..212807f78e 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpRequestLog.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpRequestLog.java @@ -18,9 +18,9 @@ package org.apache.hadoop.http; import org.apache.log4j.Logger; +import org.eclipse.jetty.server.NCSARequestLog; +import org.eclipse.jetty.server.RequestLog; 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.assertNotNull; diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java index 98f0a0ee27..a36e8caaa2 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestHttpServer.java @@ -28,6 +28,8 @@ import org.apache.hadoop.security.ShellBasedUnixGroupsMapping; import org.apache.hadoop.security.UserGroupInformation; 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.Assert; import org.junit.BeforeClass; @@ -36,8 +38,6 @@ import org.junit.rules.ExpectedException; import org.mockito.Mockito; 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.FilterChain; @@ -50,6 +50,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.MediaType; import java.io.IOException; import java.io.PrintWriter; import java.net.HttpURLConnection; @@ -81,6 +82,7 @@ public static class EchoMapServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { + response.setContentType(MediaType.TEXT_PLAIN + "; " + JettyUtils.UTF_8); PrintWriter out = response.getWriter(); Map params = request.getParameterMap(); SortedSet keys = new TreeSet(params.keySet()); @@ -108,6 +110,7 @@ public static class EchoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { + response.setContentType(MediaType.TEXT_PLAIN + "; " + JettyUtils.UTF_8); PrintWriter out = response.getWriter(); SortedSet sortedKeys = new TreeSet(); Enumeration keys = request.getParameterNames(); @@ -130,7 +133,7 @@ public static class HtmlContentServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { - response.setContentType("text/html"); + response.setContentType(MediaType.TEXT_HTML + "; " + JettyUtils.UTF_8); PrintWriter out = response.getWriter(); out.print("hello world"); out.close(); @@ -222,7 +225,8 @@ public void run() { conn = (HttpURLConnection)servletUrl.openConnection(); conn.connect(); 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 // ending in .css should not change mime type @@ -230,14 +234,16 @@ public void run() { conn = (HttpURLConnection)servletUrl.openConnection(); conn.connect(); 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 servletUrl = new URL(baseUrl, "/htmlcontent"); conn = (HttpURLConnection)servletUrl.openConnection(); conn.connect(); assertEquals(200, conn.getResponseCode()); - assertEquals("text/html; charset=utf-8", conn.getContentType()); + assertEquals(MediaType.TEXT_HTML + ";" + JettyUtils.UTF_8, + conn.getContentType()); } @Test @@ -488,7 +494,7 @@ public void testRequestQuoterWithNotNull() throws Exception { @SuppressWarnings("unchecked") private static Map parse(String jsonString) { - return (Map)JSON.parse(jsonString); + return (Map) JSON.parse(jsonString); } @Test public void testJersey() throws Exception { @@ -592,7 +598,7 @@ private HttpServer2 checkBindAddress(String host, int port, boolean findPort) // not bound, ephemeral should return requested port (0 for ephemeral) List listeners = (List) Whitebox.getInternalState(server, "listeners"); - Connector listener = (Connector) listeners.get(0); + ServerConnector listener = (ServerConnector)listeners.get(0); assertEquals(port, listener.getPort()); // verify hostname is what was given diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java index b0fadcf537..f58c230021 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/TestServletFilter.java @@ -146,9 +146,11 @@ public void testServletFilter() throws Exception { } static public class ErrorFilter extends SimpleFilter { + static final String EXCEPTION_MESSAGE = + "Throwing the exception from Filter init"; @Override 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 */ @@ -174,7 +176,8 @@ public void testServletFilterWhenInitThrowsException() throws Exception { http.start(); fail("expecting exception"); } 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()); } } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/resource/JerseyResource.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/resource/JerseyResource.java index f1313e26ca..607d17f57b 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/resource/JerseyResource.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/http/resource/JerseyResource.java @@ -32,7 +32,8 @@ import org.apache.commons.logging.Log; 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. @@ -48,7 +49,7 @@ public class JerseyResource { @GET @Path("{" + PATH + ":.*}") - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8}) public Response get( @PathParam(PATH) @DefaultValue("UNKNOWN_" + PATH) final String path, @QueryParam(OP) @DefaultValue("UNKNOWN_" + OP) final String op diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/token/delegation/web/TestWebDelegationToken.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/token/delegation/web/TestWebDelegationToken.java index 73562b559c..44241de52c 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/token/delegation/web/TestWebDelegationToken.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/token/delegation/web/TestWebDelegationToken.java @@ -31,22 +31,22 @@ import org.apache.hadoop.security.authentication.util.KerberosUtil; import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenSecretManager; 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.Assert; import org.junit.Before; import org.junit.Test; -import org.mortbay.jetty.AbstractConnector; -import org.mortbay.jetty.Connector; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.servlet.Context; -import org.mortbay.jetty.servlet.FilterHolder; -import org.mortbay.jetty.servlet.ServletHolder; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlet.ServletHolder; import javax.security.auth.Subject; import javax.security.auth.kerberos.KerberosPrincipal; import javax.security.auth.login.AppConfigurationEntry; import javax.security.auth.login.Configuration; import javax.security.auth.login.LoginContext; +import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; @@ -66,6 +66,7 @@ import java.security.Principal; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -177,7 +178,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) protected Server createJettyServer() { try { jetty = new Server(0); - jetty.getConnectors()[0].setHost("localhost"); + ((ServerConnector)jetty.getConnectors()[0]).setHost("localhost"); return jetty; } catch (Exception ex) { throw new RuntimeException("Could not setup Jetty: " + ex.getMessage(), @@ -186,7 +187,7 @@ protected Server createJettyServer() { } protected String getJettyURL() { - Connector c = jetty.getConnectors()[0]; + ServerConnector c = (ServerConnector)jetty.getConnectors()[0]; return "http://" + c.getHost() + ":" + c.getLocalPort(); } @@ -217,10 +218,11 @@ protected Server getJetty() { @Test public void testRawHttpCalls() throws Exception { final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { jetty.start(); @@ -337,10 +339,11 @@ public void testDelegationTokenAuthenticatorCallsWithQueryString() private void testDelegationTokenAuthenticatorCalls(final boolean useQS) throws Exception { final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { @@ -446,10 +449,11 @@ public void testExternalDelegationTokenSecretManager() throws Exception { DummyDelegationTokenSecretManager secretMgr = new DummyDelegationTokenSecretManager(); final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { secretMgr.startThreads(); @@ -525,10 +529,11 @@ public void testDelegationTokenAuthenticationURLWithNoDTHandler() private void testDelegationTokenAuthenticatedURLWithNoDT( Class filterClass) throws Exception { final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { @@ -594,10 +599,11 @@ protected org.apache.hadoop.conf.Configuration getProxyuserConfiguration( public void testFallbackToPseudoDelegationTokenAuthenticator() throws Exception { final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { @@ -745,11 +751,11 @@ private void testKerberosDelegationTokenAuthenticator( Assert.assertTrue(testDir.mkdirs()); MiniKdc kdc = new MiniKdc(MiniKdc.createConf(), testDir); final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); jetty.setHandler(context); - ((AbstractConnector)jetty.getConnectors()[0]).setResolveNames(true); - context.addFilter(new FilterHolder(KDTAFilter.class), "/*", 0); + context.addFilter(new FilterHolder(KDTAFilter.class), "/*", + EnumSet.of(DispatcherType.REQUEST)); context.addServlet(new ServletHolder(UserServlet.class), "/bar"); try { kdc.start(); @@ -824,10 +830,11 @@ public Void call() throws Exception { @Test public void testProxyUser() throws Exception { final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { @@ -921,10 +928,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) @Test public void testHttpUGI() throws Exception { final Server jetty = createJettyServer(); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { @@ -980,12 +988,12 @@ public static class IpAddressBasedPseudoDTAFilter extends PseudoDTAFilter { @Test public void testIpaddressCheck() throws Exception { final Server jetty = createJettyServer(); - ((AbstractConnector)jetty.getConnectors()[0]).setResolveNames(true); - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/foo"); 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"); try { diff --git a/hadoop-common-project/hadoop-kms/pom.xml b/hadoop-common-project/hadoop-kms/pom.xml index f65e94ad20..3eaaf52c02 100644 --- a/hadoop-common-project/hadoop-kms/pom.xml +++ b/hadoop-common-project/hadoop-kms/pom.xml @@ -80,12 +80,12 @@ javax.servlet - servlet-api + javax.servlet-api provided - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server test @@ -111,7 +111,7 @@ javax.servlet - servlet-api + javax.servlet-api javax.servlet @@ -122,19 +122,19 @@ jsp-api - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server - org.mortbay.jetty + org.eclipse.jetty jetty-util - org.mortbay.jetty + org.eclipse.jetty jsp-api-2.1 - org.mortbay.jetty + org.eclipse.jetty servlet-api-2.5 @@ -178,7 +178,7 @@ compile - org.mortbay.jetty + org.eclipse.jetty jetty-util compile diff --git a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java index d8755ec3d9..271c339a8f 100644 --- a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java +++ b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMS.java @@ -24,6 +24,7 @@ import org.apache.hadoop.crypto.key.KeyProviderCryptoExtension; import org.apache.hadoop.crypto.key.KeyProviderCryptoExtension.EncryptedKeyVersion; 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.UserGroupInformation; import org.apache.hadoop.crypto.key.kms.KMSClientProvider; @@ -101,7 +102,7 @@ private static URI getKeyURI(String domain, String keyName) { @POST @Path(KMSRESTConstants.KEYS_RESOURCE) @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) @SuppressWarnings("unchecked") public Response createKey(Map jsonKey) throws Exception { try{ @@ -204,7 +205,7 @@ public Void run() throws Exception { @POST @Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}") @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response rolloverKey(@PathParam("name") final String name, Map jsonMaterial) throws Exception { try { @@ -254,7 +255,7 @@ public KeyVersion run() throws Exception { @GET @Path(KMSRESTConstants.KEYS_METADATA_RESOURCE) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getKeysMetadata(@QueryParam(KMSRESTConstants.KEY) List keyNamesList) throws Exception { try { @@ -287,7 +288,7 @@ public KeyProvider.Metadata[] run() throws Exception { @GET @Path(KMSRESTConstants.KEYS_NAMES_RESOURCE) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getKeyNames() throws Exception { try { LOG.trace("Entering getKeyNames method."); @@ -332,7 +333,7 @@ public Response getKey(@PathParam("name") String name) @GET @Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" + KMSRESTConstants.METADATA_SUB_RESOURCE) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getMetadata(@PathParam("name") final String name) throws Exception { try { @@ -366,7 +367,7 @@ public KeyProvider.Metadata run() throws Exception { @GET @Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" + KMSRESTConstants.CURRENT_VERSION_SUB_RESOURCE) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getCurrentVersion(@PathParam("name") final String name) throws Exception { try { @@ -399,7 +400,7 @@ public KeyVersion run() throws Exception { @GET @Path(KMSRESTConstants.KEY_VERSION_RESOURCE + "/{versionName:.*}") - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getKeyVersion( @PathParam("versionName") final String versionName) throws Exception { try { @@ -436,7 +437,7 @@ public KeyVersion run() throws Exception { @GET @Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" + KMSRESTConstants.EEK_SUB_RESOURCE) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response generateEncryptedKeys( @PathParam("name") final String name, @QueryParam(KMSRESTConstants.EEK_OP) String edekOp, @@ -508,7 +509,7 @@ public Void run() throws Exception { @POST @Path(KMSRESTConstants.KEY_VERSION_RESOURCE + "/{versionName:.*}/" + KMSRESTConstants.EEK_SUB_RESOURCE) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response decryptEncryptedKey( @PathParam("versionName") final String versionName, @QueryParam(KMSRESTConstants.EEK_OP) String eekOp, @@ -577,7 +578,7 @@ public KeyVersion run() throws Exception { @GET @Path(KMSRESTConstants.KEY_RESOURCE + "/{name:.*}/" + KMSRESTConstants.VERSIONS_SUB_RESOURCE) - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getKeyVersions(@PathParam("name") final String name) throws Exception { try { diff --git a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSAuthenticationFilter.java b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSAuthenticationFilter.java index 928a8aa48f..8efef7377e 100644 --- a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSAuthenticationFilter.java +++ b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSAuthenticationFilter.java @@ -114,7 +114,19 @@ public void sendError(int sc) throws IOException { 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 + @Deprecated + @SuppressWarnings("deprecation") public void setStatus(int sc, String sm) { statusCode = sc; msg = sm; diff --git a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSJSONWriter.java b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSJSONWriter.java index 31fac9f7b2..4b8a5be39a 100644 --- a/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSJSONWriter.java +++ b/hadoop-common-project/hadoop-kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSJSONWriter.java @@ -18,6 +18,7 @@ package org.apache.hadoop.crypto.key.kms.server; import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.http.JettyUtils; import org.codehaus.jackson.map.ObjectMapper; import javax.ws.rs.Produces; @@ -41,7 +42,7 @@ * to their JSON representation. */ @Provider -@Produces(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) @InterfaceAudience.Private public class KMSJSONWriter implements MessageBodyWriter { diff --git a/hadoop-common-project/hadoop-kms/src/test/java/org/apache/hadoop/crypto/key/kms/server/MiniKMS.java b/hadoop-common-project/hadoop-kms/src/test/java/org/apache/hadoop/crypto/key/kms/server/MiniKMS.java index 292d731a67..8b181ad642 100644 --- a/hadoop-common-project/hadoop-kms/src/test/java/org/apache/hadoop/crypto/key/kms/server/MiniKMS.java +++ b/hadoop-common-project/hadoop-kms/src/test/java/org/apache/hadoop/crypto/key/kms/server/MiniKMS.java @@ -21,14 +21,19 @@ import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.crypto.key.kms.KMSRESTConstants; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.util.ThreadUtil; -import org.apache.hadoop.security.ssl.SslSelectChannelConnectorSecure; -import org.mortbay.jetty.Connector; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.security.SslSelectChannelConnector; -import org.mortbay.jetty.webapp.WebAppContext; +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.eclipse.jetty.webapp.WebAppContext; import java.io.File; import java.io.FileOutputStream; @@ -37,11 +42,7 @@ import java.io.OutputStream; import java.io.Writer; import java.io.IOException; -import java.net.InetAddress; import java.net.MalformedURLException; -import java.net.ServerSocket; -import java.net.URI; -import java.net.URISyntaxException; import java.net.URL; import java.util.UUID; @@ -51,18 +52,28 @@ private static Server createJettyServer(String keyStore, String password, int in try { boolean ssl = keyStore != null; String host = "localhost"; - Server server = new Server(inPort); - if (!ssl) { - server.getConnectors()[0].setHost(host); - } else { - SslSelectChannelConnector c = new SslSelectChannelConnectorSecure(); - c.setHost(host); - c.setNeedClientAuth(false); - c.setKeystore(keyStore); - c.setKeystoreType("jks"); - c.setKeyPassword(password); - server.setConnectors(new Connector[]{c}); + Server server = new Server(); + ServerConnector conn = new ServerConnector(server); + HttpConfiguration httpConfig = new HttpConfiguration(); + httpConfig.setRequestHeaderSize(JettyUtils.HEADER_SIZE); + httpConfig.setResponseHeaderSize(JettyUtils.HEADER_SIZE); + httpConfig.setSecureScheme("https"); + httpConfig.addCustomizer(new SecureRequestCustomizer()); + ConnectionFactory connFactory = new HttpConnectionFactory(httpConfig); + conn.addConnectionFactory(connFactory); + conn.setHost(host); + 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; } catch (Exception ex) { 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) { - boolean ssl = server.getConnectors()[0].getClass() - == SslSelectChannelConnectorSecure.class; + boolean ssl = server.getConnectors()[0] + .getConnectionFactory(SslConnectionFactory.class) != null; try { String scheme = (ssl) ? "https" : "http"; return new URL(scheme + "://" + - server.getConnectors()[0].getHost() + ":" + - server.getConnectors()[0].getLocalPort()); + ((ServerConnector)server.getConnectors()[0]).getHost() + ":" + + ((ServerConnector)server.getConnectors()[0]).getLocalPort()); } catch (MalformedURLException ex) { throw new RuntimeException("It should never happen, " + ex.getMessage(), ex); @@ -217,7 +228,7 @@ public void start() throws Exception { if (webXmlInJar) { context.setClassLoader(cl); } - jetty.addHandler(context); + jetty.setHandler(context); jetty.start(); kmsURL = new URL(getJettyURL(jetty), "kms"); } diff --git a/hadoop-common-project/hadoop-nfs/pom.xml b/hadoop-common-project/hadoop-nfs/pom.xml index c943f3cfb8..027cf3479e 100644 --- a/hadoop-common-project/hadoop-nfs/pom.xml +++ b/hadoop-common-project/hadoop-nfs/pom.xml @@ -63,7 +63,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml b/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml index 0aa5fc143d..928ada9684 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/pom.xml @@ -75,7 +75,7 @@ javax.servlet - servlet-api + javax.servlet-api provided @@ -89,8 +89,8 @@ compile - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server test @@ -108,22 +108,22 @@ javax.servlet - servlet-api + javax.servlet-api javax.servlet.jsp jsp-api - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server - org.mortbay.jetty + org.eclipse.jetty jetty-util - org.mortbay.jetty + org.eclipse.jetty servlet-api-2.5 @@ -155,18 +155,18 @@ javax.servlet - servlet-api + javax.servlet-api - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server - org.mortbay.jetty + org.eclipse.jetty jetty-util - org.mortbay.jetty + org.eclipse.jetty servlet-api-2.5 diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java index a4db124c05..677bca7f97 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/fs/http/server/HttpFSServer.java @@ -48,6 +48,7 @@ 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.XAttrValueParam; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.lib.service.FileSystemAccess; import org.apache.hadoop.lib.service.FileSystemAccessException; import org.apache.hadoop.lib.service.Groups; @@ -168,7 +169,7 @@ private void enforceRootPath(HttpFSFileSystem.Operation op, String path) { * {@link HttpFSExceptionProvider}. */ @GET - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response getRoot(@QueryParam(OperationParam.NAME) OperationParam op, @Context Parameters params, @Context HttpServletRequest request) @@ -197,7 +198,8 @@ private String makeAbsolute(String path) { */ @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 get(@PathParam("path") String path, @QueryParam(OperationParam.NAME) OperationParam op, @Context Parameters params, @@ -363,7 +365,7 @@ public InputStream run() throws Exception { */ @DELETE @Path("{path:.*}") - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response delete(@PathParam("path") String path, @QueryParam(OperationParam.NAME) OperationParam op, @Context Parameters params, @@ -414,7 +416,7 @@ public Response delete(@PathParam("path") String path, @POST @Path("{path:.*}") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8}) public Response post(InputStream is, @Context UriInfo uriInfo, @PathParam("path") String path, @@ -509,7 +511,7 @@ protected URI createUploadRedirectionURL(UriInfo uriInfo, Enum uploadOperatio @PUT @Path("{path:.*}") @Consumes({"*/*"}) - @Produces({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8}) public Response put(InputStream is, @Context UriInfo uriInfo, @PathParam("path") String path, diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONMapProvider.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONMapProvider.java index 05bb9a1cad..a1525a229c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONMapProvider.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONMapProvider.java @@ -19,6 +19,7 @@ package org.apache.hadoop.lib.wsrs; import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.http.JettyUtils; import org.json.simple.JSONObject; import javax.ws.rs.Produces; @@ -37,7 +38,7 @@ import java.util.Map; @Provider -@Produces(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) @InterfaceAudience.Private public class JSONMapProvider implements MessageBodyWriter { private static final String ENTER = System.getProperty("line.separator"); diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONProvider.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONProvider.java index 7e1f98ba68..8ae9145680 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONProvider.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/main/java/org/apache/hadoop/lib/wsrs/JSONProvider.java @@ -19,6 +19,7 @@ package org.apache.hadoop.lib.wsrs; import org.apache.hadoop.classification.InterfaceAudience; +import org.apache.hadoop.http.JettyUtils; import org.json.simple.JSONStreamAware; import javax.ws.rs.Produces; @@ -36,7 +37,7 @@ import java.nio.charset.StandardCharsets; @Provider -@Produces(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) @InterfaceAudience.Private public class JSONProvider implements MessageBodyWriter { private static final String ENTER = System.getProperty("line.separator"); diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/client/BaseTestHttpFSWith.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/client/BaseTestHttpFSWith.java index e475803a25..4e25e5648e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/client/BaseTestHttpFSWith.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/client/BaseTestHttpFSWith.java @@ -49,8 +49,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.webapp.WebAppContext; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppContext; import com.google.common.collect.Lists; @@ -127,7 +127,7 @@ private void createHttpFSServer() throws Exception { URL url = cl.getResource("webapp"); WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs"); Server server = TestJettyHelper.getJettyServer(); - server.addHandler(context); + server.setHandler(context); server.start(); } diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java index c6a7a9d457..a9c36b08c6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServer.java @@ -64,8 +64,8 @@ import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.junit.Test; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.webapp.WebAppContext; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppContext; import com.google.common.collect.Maps; import java.util.Properties; @@ -171,7 +171,7 @@ private void createHttpFSServer(boolean addDelegationTokenAuthHandler) URL url = cl.getResource("webapp"); WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs"); Server server = TestJettyHelper.getJettyServer(); - server.addHandler(context); + server.setHandler(context); server.start(); if (addDelegationTokenAuthHandler) { HttpFSServerWebApp.get().setAuthority(TestJettyHelper.getAuthority()); diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoACLs.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoACLs.java index cadec2e639..289ddc49eb 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoACLs.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoACLs.java @@ -31,8 +31,8 @@ import org.apache.hadoop.test.TestJettyHelper; import org.junit.Assert; import org.junit.Test; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.webapp.WebAppContext; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppContext; import java.io.BufferedReader; import java.io.File; @@ -151,7 +151,7 @@ private void createHttpFSServer() throws Exception { } WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs"); Server server = TestJettyHelper.getJettyServer(); - server.addHandler(context); + server.setHandler(context); server.start(); } diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoXAttrs.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoXAttrs.java index 951b3fbb1f..7571125c08 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoXAttrs.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSServerNoXAttrs.java @@ -32,8 +32,8 @@ import org.apache.hadoop.test.TestJettyHelper; import org.junit.Assert; import org.junit.Test; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.webapp.WebAppContext; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppContext; import java.io.BufferedReader; import java.io.File; @@ -152,7 +152,7 @@ private void createHttpFSServer() throws Exception { } WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs"); Server server = TestJettyHelper.getJettyServer(); - server.addHandler(context); + server.setHandler(context); server.start(); } diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSWithKerberos.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSWithKerberos.java index 757e3fd7e7..fafeff076e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSWithKerberos.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/fs/http/server/TestHttpFSWithKerberos.java @@ -41,8 +41,8 @@ import org.junit.After; import org.junit.Assert; import org.junit.Test; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.webapp.WebAppContext; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.webapp.WebAppContext; import java.io.File; import java.io.FileOutputStream; @@ -105,7 +105,7 @@ private void createHttpFSServer() throws Exception { URL url = cl.getResource("webapp"); WebAppContext context = new WebAppContext(url.getPath(), "/webhdfs"); Server server = TestJettyHelper.getJettyServer(); - server.addHandler(context); + server.setHandler(context); server.start(); HttpFSServerWebApp.get().setAuthority(TestJettyHelper.getAuthority()); } diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHFSTestCase.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHFSTestCase.java index eb2cdc6142..2d09b80576 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHFSTestCase.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHFSTestCase.java @@ -38,9 +38,9 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.util.Time; +import org.eclipse.jetty.servlet.ServletContextHandler; import org.junit.Test; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.servlet.Context; +import org.eclipse.jetty.server.Server; public class TestHFSTestCase extends HFSTestCase { @@ -165,11 +165,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se @Test @TestJetty public void testJetty() throws Exception { - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/"); context.addServlet(MyServlet.class, "/bar"); Server server = TestJettyHelper.getJettyServer(); - server.addHandler(context); + server.setHandler(context); server.start(); URL url = new URL(TestJettyHelper.getJettyURL(), "/bar"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHTestCase.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHTestCase.java index 74d34ec80e..be01285fa8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHTestCase.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestHTestCase.java @@ -33,9 +33,9 @@ import javax.servlet.http.HttpServletResponse; import org.apache.hadoop.util.Time; +import org.eclipse.jetty.servlet.ServletContextHandler; import org.junit.Test; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.servlet.Context; +import org.eclipse.jetty.server.Server; public class TestHTestCase extends HTestCase { @@ -132,11 +132,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se @Test @TestJetty public void testJetty() throws Exception { - Context context = new Context(); + ServletContextHandler context = new ServletContextHandler(); context.setContextPath("/"); context.addServlet(MyServlet.class, "/bar"); Server server = TestJettyHelper.getJettyServer(); - server.addHandler(context); + server.setHandler(context); server.start(); URL url = new URL(TestJettyHelper.getJettyURL(), "/bar"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); diff --git a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java index a9b661e293..1da3901b39 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java +++ b/hadoop-hdfs-project/hadoop-hdfs-httpfs/src/test/java/org/apache/hadoop/test/TestJettyHelper.java @@ -24,14 +24,19 @@ import java.net.URL; import java.net.UnknownHostException; -import org.apache.hadoop.security.ssl.SslSelectChannelConnectorSecure; -import org.junit.Test; +import org.apache.hadoop.http.JettyUtils; +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.runners.model.FrameworkMethod; 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 { private boolean ssl; @@ -88,20 +93,27 @@ private Server createJettyServer() { ServerSocket ss = new ServerSocket(0, 50, localhost); int port = ss.getLocalPort(); ss.close(); - Server server = new Server(0); - if (!ssl) { - server.getConnectors()[0].setHost(host); - server.getConnectors()[0].setPort(port); - } else { - SslSelectChannelConnector c = new SslSelectChannelConnectorSecure(); - c.setHost(host); - c.setPort(port); - c.setNeedClientAuth(false); - c.setKeystore(keyStore); - c.setKeystoreType(keyStoreType); - c.setKeyPassword(keyStorePassword); - server.setConnectors(new Connector[] {c}); + Server server = new Server(); + ServerConnector conn = new ServerConnector(server); + HttpConfiguration http_config = new HttpConfiguration(); + http_config.setRequestHeaderSize(JettyUtils.HEADER_SIZE); + http_config.setResponseHeaderSize(JettyUtils.HEADER_SIZE); + http_config.setSecureScheme("https"); + http_config.addCustomizer(new SecureRequestCustomizer()); + ConnectionFactory connFactory = new HttpConnectionFactory(http_config); + conn.addConnectionFactory(connFactory); + conn.setHost(host); + conn.setPort(port); + if (ssl) { + 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; } catch (Exception ex) { throw new RuntimeException("Could not start embedded servlet container, " + ex.getMessage(), ex); @@ -117,8 +129,8 @@ public static InetSocketAddress getAuthority() { Server server = getJettyServer(); try { InetAddress add = - InetAddress.getByName(server.getConnectors()[0].getHost()); - int port = server.getConnectors()[0].getPort(); + InetAddress.getByName(((ServerConnector)server.getConnectors()[0]).getHost()); + int port = ((ServerConnector)server.getConnectors()[0]).getPort(); return new InetSocketAddress(add, port); } catch (UnknownHostException ex) { throw new RuntimeException(ex); @@ -157,8 +169,8 @@ public static URL getJettyURL() { try { String scheme = (helper.ssl) ? "https" : "http"; return new URL(scheme + "://" + - helper.server.getConnectors()[0].getHost() + ":" + - helper.server.getConnectors()[0].getPort()); + ((ServerConnector)helper.server.getConnectors()[0]).getHost() + ":" + + ((ServerConnector)helper.server.getConnectors()[0]).getPort()); } catch (MalformedURLException ex) { throw new RuntimeException("It should never happen, " + ex.getMessage(), ex); } diff --git a/hadoop-hdfs-project/hadoop-hdfs-nfs/pom.xml b/hadoop-hdfs-project/hadoop-hdfs-nfs/pom.xml index 7bbfe8726b..5746814e8f 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-nfs/pom.xml +++ b/hadoop-hdfs-project/hadoop-hdfs-nfs/pom.xml @@ -85,12 +85,12 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> compile - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server compile - org.mortbay.jetty + org.eclipse.jetty jetty-util compile @@ -146,7 +146,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> javax.servlet - servlet-api + javax.servlet-api compile diff --git a/hadoop-hdfs-project/hadoop-hdfs/pom.xml b/hadoop-hdfs-project/hadoop-hdfs/pom.xml index b06cd4c56c..36db4d8d4e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/pom.xml +++ b/hadoop-hdfs-project/hadoop-hdfs/pom.xml @@ -75,15 +75,20 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> compile - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server compile - org.mortbay.jetty + org.eclipse.jetty jetty-util compile + + org.eclipse.jetty + jetty-util-ajax + compile + com.sun.jersey jersey-core @@ -136,7 +141,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> javax.servlet - servlet-api + javax.servlet-api compile @@ -356,6 +361,18 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd"> ${project.build.directory}/generated-sources/java + + resource-gz + generate-resources + + resource-gz + + + ${basedir}/src/main/webapps/static + ${basedir}/target/webapps/static + js,css + + diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JournalNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JournalNode.java index d08b40f0e7..cde011244c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JournalNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/qjournal/server/JournalNode.java @@ -49,7 +49,7 @@ import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; 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.collect.Maps; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java index 9ceffc2e7e..f89d38c5e7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java @@ -212,7 +212,7 @@ import org.apache.hadoop.util.Time; import org.apache.hadoop.util.VersionInfo; 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.base.Joiner; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 88c768125f..3c782e273f 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -283,7 +283,7 @@ import org.apache.log4j.Appender; import org.apache.log4j.AsyncAppender; 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.base.Charsets; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java index 5135838d8a..a846f60f59 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java @@ -53,7 +53,7 @@ import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.net.DNS; 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.base.Preconditions; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/TransferFsImage.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/TransferFsImage.java index 0186d8b3bd..e4b95ee0fe 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/TransferFsImage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/TransferFsImage.java @@ -64,7 +64,7 @@ import com.google.common.annotations.VisibleForTesting; 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. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java index 4247a673bc..cea3339e2c 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java @@ -84,6 +84,7 @@ import org.apache.hadoop.hdfs.web.WebHdfsConstants; import org.apache.hadoop.hdfs.web.WebHdfsFileSystem; import org.apache.hadoop.hdfs.web.resources.*; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.io.Text; import org.apache.hadoop.ipc.ExternalCall; import org.apache.hadoop.ipc.RetriableException; @@ -355,7 +356,8 @@ private URI redirectURI(final NameNode namenode, @PUT @Path("/") @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( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -395,13 +397,13 @@ public Response putRoot( final CreateParentParam createParent, @QueryParam(TokenArgumentParam.NAME) @DefaultValue(TokenArgumentParam.DEFAULT) final TokenArgumentParam delegationTokenArgument, - @QueryParam(AclPermissionParam.NAME) @DefaultValue(AclPermissionParam.DEFAULT) + @QueryParam(AclPermissionParam.NAME) @DefaultValue(AclPermissionParam.DEFAULT) final AclPermissionParam aclPermission, - @QueryParam(XAttrNameParam.NAME) @DefaultValue(XAttrNameParam.DEFAULT) + @QueryParam(XAttrNameParam.NAME) @DefaultValue(XAttrNameParam.DEFAULT) final XAttrNameParam xattrName, - @QueryParam(XAttrValueParam.NAME) @DefaultValue(XAttrValueParam.DEFAULT) + @QueryParam(XAttrValueParam.NAME) @DefaultValue(XAttrValueParam.DEFAULT) final XAttrValueParam xattrValue, - @QueryParam(XAttrSetFlagParam.NAME) @DefaultValue(XAttrSetFlagParam.DEFAULT) + @QueryParam(XAttrSetFlagParam.NAME) @DefaultValue(XAttrSetFlagParam.DEFAULT) final XAttrSetFlagParam xattrSetFlag, @QueryParam(SnapshotNameParam.NAME) @DefaultValue(SnapshotNameParam.DEFAULT) final SnapshotNameParam snapshotName, @@ -426,7 +428,8 @@ public Response putRoot( @PUT @Path("{" + UriFsPathParam.NAME + ":.*}") @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( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -532,7 +535,7 @@ private Response put( final TokenArgumentParam delegationTokenArgument, final AclPermissionParam aclPermission, final XAttrNameParam xattrName, - final XAttrValueParam xattrValue, + final XAttrValueParam xattrValue, final XAttrSetFlagParam xattrSetFlag, final SnapshotNameParam snapshotName, final OldSnapshotNameParam oldSnapshotName, @@ -690,7 +693,8 @@ private Response put( @POST @Path("/") @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( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -720,7 +724,8 @@ public Response postRoot( @POST @Path("{" + UriFsPathParam.NAME + ":.*}") @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( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -799,7 +804,7 @@ private Response post( "newLength parameter is Missing"); } // We treat each rest request as a separate client. - final boolean b = np.truncate(fullpath, newLength.getValue(), + final boolean b = np.truncate(fullpath, newLength.getValue(), "DFSClient_" + DFSUtil.getSecureRandom().nextLong()); final String js = JsonUtil.toJsonString("boolean", b); return Response.ok(js).type(MediaType.APPLICATION_JSON).build(); @@ -812,7 +817,8 @@ private Response post( /** Handle HTTP GET request for the root. */ @GET @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( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -831,9 +837,9 @@ public Response getRoot( final RenewerParam renewer, @QueryParam(BufferSizeParam.NAME) @DefaultValue(BufferSizeParam.DEFAULT) final BufferSizeParam bufferSize, - @QueryParam(XAttrNameParam.NAME) @DefaultValue(XAttrNameParam.DEFAULT) + @QueryParam(XAttrNameParam.NAME) @DefaultValue(XAttrNameParam.DEFAULT) final List xattrNames, - @QueryParam(XAttrEncodingParam.NAME) @DefaultValue(XAttrEncodingParam.DEFAULT) + @QueryParam(XAttrEncodingParam.NAME) @DefaultValue(XAttrEncodingParam.DEFAULT) final XAttrEncodingParam xattrEncoding, @QueryParam(ExcludeDatanodesParam.NAME) @DefaultValue(ExcludeDatanodesParam.DEFAULT) final ExcludeDatanodesParam excludeDatanodes, @@ -856,7 +862,8 @@ public Response getRoot( /** Handle HTTP GET request. */ @GET @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( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -1131,7 +1138,7 @@ public Void run() throws IOException { /** Handle HTTP DELETE request for the root. */ @DELETE @Path("/") - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response deleteRoot( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) @@ -1154,7 +1161,7 @@ public Response deleteRoot( /** Handle HTTP DELETE request. */ @DELETE @Path("{" + UriFsPathParam.NAME + ":.*}") - @Produces(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8) public Response delete( @Context final UserGroupInformation ugi, @QueryParam(DelegationParam.NAME) @DefaultValue(DelegationParam.DEFAULT) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDecommission.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDecommission.java index 6ca1e79e98..34ae12c0ea 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDecommission.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDecommission.java @@ -64,7 +64,7 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; -import org.mortbay.util.ajax.JSON; +import org.eclipse.jetty.util.ajax.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournalNodeMXBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournalNodeMXBean.java index 45b245a64b..1de37a4d24 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournalNodeMXBean.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/qjournal/server/TestJournalNodeMXBean.java @@ -35,7 +35,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mortbay.util.ajax.JSON; +import org.eclipse.jetty.util.ajax.JSON; /** * Test {@link JournalNodeMXBean} diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockStatsMXBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockStatsMXBean.java index 9e3112e4b4..476565dc02 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockStatsMXBean.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockStatsMXBean.java @@ -40,7 +40,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.mortbay.util.ajax.JSON; +import org.eclipse.jetty.util.ajax.JSON; /** * Class for testing {@link BlockStatsMXBean} implementation diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMXBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMXBean.java index a77c94335d..6933c3eb5d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMXBean.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/TestDataNodeMXBean.java @@ -40,7 +40,7 @@ import org.codehaus.jackson.type.TypeReference; import org.junit.Assert; 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.assertTrue; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java index 3c0d54acb5..4687cfdfe9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java @@ -35,7 +35,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hdfs.MiniDFSCluster; import org.junit.Test; -import org.mortbay.util.ajax.JSON; +import org.eclipse.jetty.util.ajax.JSON; /** * Class for testing {@link NameNodeMXBean} implementation diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java index 47f1c85010..659a1d2458 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeMXBean.java @@ -53,7 +53,7 @@ import org.codehaus.jackson.map.ObjectMapper; import org.junit.Assert; import org.junit.Test; -import org.mortbay.util.ajax.JSON; +import org.eclipse.jetty.util.ajax.JSON; import javax.management.MBeanServer; import javax.management.ObjectName; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java index 0f22e9a4bc..bff549a1e1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java @@ -36,7 +36,7 @@ import org.apache.hadoop.hdfs.server.namenode.startupprogress.StartupProgress; import org.junit.Before; import org.junit.Test; -import org.mortbay.util.ajax.JSON; +import org.eclipse.jetty.util.ajax.JSON; public class TestStartupProgressServlet { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestTransferFsImage.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestTransferFsImage.java index ca97e3294a..df02b35f72 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestTransferFsImage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestTransferFsImage.java @@ -120,7 +120,7 @@ public void testClientSideExceptionOnJustOneDir() throws IOException { /** * Test to verify the read timeout */ - @Test(timeout = 5000) + @Test(timeout = 10000) public void testGetImageTimeout() throws Exception { HttpServer2 testServer = HttpServerFunctionalTest.createServer("hdfs"); try { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHDFSForHA.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHDFSForHA.java index 9f78548b9c..4e1ceeddfe 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHDFSForHA.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/TestWebHDFSForHA.java @@ -56,7 +56,7 @@ import org.junit.Assert; import org.junit.Test; 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.ws.rs.core.Response; diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/test/MiniDFSClusterManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/test/MiniDFSClusterManager.java index f8e931a904..1373891fc8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/test/MiniDFSClusterManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/test/MiniDFSClusterManager.java @@ -38,7 +38,7 @@ import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.MiniDFSCluster; 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 diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/JobEndNotifier.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/JobEndNotifier.java index 05bb40bb9d..836fad5264 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/JobEndNotifier.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/JobEndNotifier.java @@ -30,7 +30,7 @@ import org.apache.hadoop.mapred.JobContext; import org.apache.hadoop.mapreduce.MRJobConfig; import org.apache.hadoop.mapreduce.v2.api.records.JobReport; -import org.mortbay.log.Log; +import org.eclipse.jetty.util.log.Log; /** *

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); proxyToUse = new Proxy(proxyType, new InetSocketAddress(hostname, port)); - Log.info("Job end notification using proxy type \"" + proxyType + - "\" hostname \"" + hostname + "\" and port \"" + port + "\""); + Log.getLog().info("Job end notification using proxy type \"" + + proxyType + "\" hostname \"" + hostname + "\" and port \"" + port + + "\""); } catch(NumberFormatException nfe) { - Log.warn("Job end notification couldn't parse configured proxy's port " - + portConf + ". Not going to use a proxy"); + Log.getLog().warn("Job end notification couldn't parse configured" + + "proxy's port " + portConf + ". Not going to use a proxy"); } } @@ -121,23 +122,25 @@ public Configuration getConf() { protected boolean notifyURLOnce() { boolean success = false; try { - Log.info("Job end notification trying " + urlToNotify); + Log.getLog().info("Job end notification trying " + urlToNotify); HttpURLConnection conn = (HttpURLConnection) urlToNotify.openConnection(proxyToUse); conn.setConnectTimeout(timeout); conn.setReadTimeout(timeout); conn.setAllowUserInteraction(false); if(conn.getResponseCode() != HttpURLConnection.HTTP_OK) { - Log.warn("Job end notification to " + urlToNotify +" failed with code: " - + conn.getResponseCode() + " and message \"" + conn.getResponseMessage() - +"\""); + Log.getLog().warn("Job end notification to " + urlToNotify + + " failed with code: " + conn.getResponseCode() + " and message \"" + + conn.getResponseMessage() + "\""); } else { success = true; - Log.info("Job end notification to " + urlToNotify + " succeeded"); + Log.getLog().info("Job end notification to " + urlToNotify + + " succeeded"); } } catch(IOException ioe) { - Log.warn("Job end notification to " + urlToNotify + " failed", ioe); + Log.getLog().warn("Job end notification to " + urlToNotify + " failed", + ioe); } return success; } @@ -152,7 +155,7 @@ public void notify(JobReport jobReport) throws InterruptedException { // Do we need job-end notification? if (userUrl == null) { - Log.info("Job end notification URL not set, skipping."); + Log.getLog().info("Job end notification URL not set, skipping."); return; } @@ -168,23 +171,25 @@ public void notify(JobReport jobReport) try { urlToNotify = new URL(userUrl); } 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; } // Send notification boolean success = false; while (numTries-- > 0 && !success) { - Log.info("Job end notification attempts left " + numTries); + Log.getLog().info("Job end notification attempts left " + numTries); success = notifyURLOnce(); if (!success) { Thread.sleep(waitInterval); } } if (!success) { - Log.warn("Job end notification failed to notify : " + urlToNotify); + Log.getLog().warn("Job end notification failed to notify : " + + urlToNotify); } else { - Log.info("Job end notification succeeded for " + jobReport.getJobId()); + Log.getLog().info("Job end notification succeeded for " + + jobReport.getJobId()); } } } diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/AMWebServices.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/AMWebServices.java index 5d50db7154..f477d314c7 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/AMWebServices.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/webapp/AMWebServices.java @@ -38,6 +38,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.mapreduce.JobACL; import org.apache.hadoop.mapreduce.v2.api.protocolrecords.KillTaskAttemptRequest; import org.apache.hadoop.mapreduce.v2.api.protocolrecords.KillTaskAttemptResponse; @@ -221,14 +222,16 @@ void checkAccess(Job job, HttpServletRequest request) { } @GET - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, + MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 }) public AppInfo get() { return getAppInfo(); } @GET @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() { init(); return new AppInfo(this.app, this.app.context); @@ -236,7 +239,8 @@ public AppInfo getAppInfo() { @GET @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() { init(); return new BlacklistedNodesInfo(this.app.context); @@ -244,7 +248,8 @@ public BlacklistedNodesInfo getBlacklistedNodes() { @GET @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) { init(); JobsInfo allJobs = new JobsInfo(); @@ -261,7 +266,8 @@ public JobsInfo getJobs(@Context HttpServletRequest hsr) { @GET @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, @PathParam("jobid") String jid) { init(); @@ -271,7 +277,8 @@ public JobInfo getJob(@Context HttpServletRequest hsr, @GET @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) { init(); Job job = getJobFromJobIdString(jid, appCtx); @@ -286,7 +293,8 @@ public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) { @GET @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, @PathParam("jobid") String jid) { init(); @@ -297,7 +305,8 @@ public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid) { @@ -316,7 +325,8 @@ public ConfInfo getJobConf(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid, @QueryParam("type") String type) { @@ -343,7 +353,8 @@ public TasksInfo getJobTasks(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid, @PathParam("taskid") String tid) { @@ -356,7 +367,8 @@ public TaskInfo getJobTask(@Context HttpServletRequest hsr, @GET @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( @Context HttpServletRequest hsr, @PathParam("jobid") String jid, @PathParam("taskid") String tid) { @@ -370,7 +382,8 @@ public JobTaskCounterInfo getSingleTaskCounters( @GET @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, @PathParam("jobid") String jid, @PathParam("taskid") String tid) { @@ -394,7 +407,8 @@ public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid, @PathParam("taskid") String tid, @PathParam("attemptid") String attId) { @@ -413,7 +427,8 @@ public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr, @GET @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( @Context HttpServletRequest hsr, @PathParam("jobid") String jid, @PathParam("taskid") String tid, @@ -429,7 +444,8 @@ public JobTaskAttemptState getJobTaskAttemptState( @PUT @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 }) public Response updateJobTaskAttemptState(JobTaskAttemptState targetState, @Context HttpServletRequest hsr, @PathParam("jobid") String jid, @@ -466,7 +482,8 @@ public Response updateJobTaskAttemptState(JobTaskAttemptState targetState, @GET @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( @Context HttpServletRequest hsr, @PathParam("jobid") String jid, @PathParam("taskid") String tid, @PathParam("attemptid") String attId) { diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServices.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServices.java index 71381964a7..c5dc29075d 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServices.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServices.java @@ -31,6 +31,7 @@ import javax.xml.parsers.DocumentBuilderFactory; 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.MockAppContext; import org.apache.hadoop.yarn.webapp.GenericExceptionHandler; @@ -112,7 +113,8 @@ public void testAM() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("mapreduce") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyAMInfo(json.getJSONObject("info"), appContext); @@ -123,7 +125,8 @@ public void testAMSlash() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("mapreduce/") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyAMInfo(json.getJSONObject("info"), appContext); @@ -134,7 +137,8 @@ public void testAMDefault() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("mapreduce/") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyAMInfo(json.getJSONObject("info"), appContext); @@ -145,7 +149,8 @@ public void testAMXML() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("mapreduce") .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); verifyAMInfoXML(xml, appContext); } @@ -156,7 +161,8 @@ public void testInfo() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("info").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); assertEquals("incorrect number of elements", 1, json.length()); verifyAMInfo(json.getJSONObject("info"), appContext); @@ -168,7 +174,8 @@ public void testInfoSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("info/").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); assertEquals("incorrect number of elements", 1, json.length()); verifyAMInfo(json.getJSONObject("info"), appContext); @@ -179,7 +186,8 @@ public void testInfoDefault() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("mapreduce") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyAMInfo(json.getJSONObject("info"), appContext); @@ -191,7 +199,8 @@ public void testInfoXML() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("info/").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); verifyAMInfoXML(xml, appContext); } @@ -251,7 +260,8 @@ public void testBlacklistedNodes() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("blacklistednodes").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); assertEquals("incorrect number of elements", 1, json.length()); verifyBlacklistedNodesInfo(json, appContext); @@ -263,7 +273,8 @@ public void testBlacklistedNodesXML() throws Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("blacklistednodes").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); verifyBlacklistedNodesInfoXML(xml, appContext); } diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempt.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempt.java index f2e6d632cd..f20ac6ff1b 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempt.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempt.java @@ -32,6 +32,7 @@ import javax.xml.parsers.DocumentBuilderFactory; 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.TaskAttemptId; import org.apache.hadoop.mapreduce.v2.api.records.TaskAttemptState; @@ -152,7 +153,8 @@ public void testGetTaskAttemptIdState() throws Exception { .path("attempts").path(attid).path("state") .queryParam("user.name", webserviceUserName) .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); assertEquals("incorrect number of elements", 1, json.length()); assertEquals(att.getState().toString(), json.get("state")); @@ -180,7 +182,8 @@ public void testGetTaskAttemptIdXMLState() throws Exception { .queryParam("user.name", webserviceUserName) .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -219,7 +222,8 @@ public void testPutTaskAttemptIdState() throws Exception { .accept(MediaType.APPLICATION_JSON) .type(MediaType.APPLICATION_JSON) .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); assertEquals("incorrect number of elements", 1, json.length()); assertEquals(TaskAttemptState.KILLED.toString(), json.get("state")); @@ -252,7 +256,8 @@ public void testPutTaskAttemptIdXMLState() throws Exception { .put(ClientResponse.class, "KILLED" + ""); - assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType()); + assertEquals(MediaType.APPLICATION_XML_TYPE + "; " + JettyUtils.UTF_8, + response.getType().toString()); String xml = response.getEntity(String.class); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempts.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempts.java index cbf8a55b9c..cbdbeaabc5 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempts.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesAttempts.java @@ -34,6 +34,7 @@ import javax.xml.parsers.DocumentBuilderFactory; 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.TaskAttemptId; 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") .path("jobs").path(jobId).path("tasks").path(tid).path("attempts") .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); verifyAMTaskAttempts(json, task); } @@ -146,7 +148,8 @@ public void testTaskAttemptsSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid).path("attempts/") .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); verifyAMTaskAttempts(json, task); } @@ -165,7 +168,8 @@ public void testTaskAttemptsDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid).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); verifyAMTaskAttempts(json, task); } @@ -185,7 +189,8 @@ public void testTaskAttemptsXML() throws JSONException, Exception { .path("jobs").path(jobId).path("tasks").path(tid).path("attempts") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -220,7 +225,8 @@ public void testTaskAttemptId() throws JSONException, Exception { .path("jobs").path(jobId).path("tasks").path(tid) .path("attempts").path(attid).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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("taskAttempt"); @@ -249,7 +255,8 @@ public void testTaskAttemptIdSlash() throws JSONException, Exception { .path("jobs").path(jobId).path("tasks").path(tid) .path("attempts").path(attid + "/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("taskAttempt"); @@ -277,7 +284,8 @@ public void testTaskAttemptIdDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("taskAttempt"); @@ -305,7 +313,8 @@ public void testTaskAttemptIdXML() throws JSONException, Exception { .path("attempts").path(attid).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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -377,7 +386,8 @@ private void testTaskAttemptIdErrorGeneric(String attid, String error) } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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("attempts").path(attid).path("counters") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobTaskAttemptCounters"); @@ -584,7 +595,8 @@ public void testTaskAttemptIdXMLCounters() throws JSONException, Exception { .path("attempts").path(attid).path("counters") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobConf.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobConf.java index cf71b349d8..ee7bb0e3c2 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobConf.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobConf.java @@ -37,6 +37,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.mapreduce.MRJobConfig; import org.apache.hadoop.mapreduce.v2.api.records.JobId; 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") .path("jobs").path(jobId).path("conf") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("conf"); @@ -174,7 +176,8 @@ public void testJobConfSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("conf/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("conf"); @@ -191,7 +194,8 @@ public void testJobConfDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("conf"); @@ -209,7 +213,8 @@ public void testJobConfXML() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("conf") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobs.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobs.java index a38d630ba5..cc57134d23 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobs.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesJobs.java @@ -34,6 +34,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.mapreduce.JobACL; import org.apache.hadoop.mapreduce.v2.api.records.AMInfo; 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") .path("jobs").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -140,7 +142,8 @@ public void testJobsSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs/").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -156,7 +159,8 @@ public void testJobsDefault() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -173,7 +177,8 @@ public void testJobsXML() throws Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -198,7 +203,8 @@ public void testJobId() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("job"); @@ -217,7 +223,8 @@ public void testJobIdSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId + "/").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("job"); @@ -234,7 +241,8 @@ public void testJobIdDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("job"); @@ -254,7 +262,8 @@ public void testJobIdNonExist() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -281,7 +290,8 @@ public void testJobIdInvalid() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -304,7 +314,8 @@ public void testJobIdInvalidDefault() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -327,7 +338,8 @@ public void testJobIdInvalidXML() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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); System.out.println(msg); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); @@ -366,7 +378,8 @@ public void testJobIdInvalidBogus() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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") .path("jobs").path(jobId).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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -629,7 +643,8 @@ public void testJobCounters() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("counters") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobCounters"); @@ -647,7 +662,8 @@ public void testJobCountersSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("counters/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobCounters"); @@ -664,7 +680,8 @@ public void testJobCountersDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobCounters"); @@ -682,7 +699,8 @@ public void testJobCountersXML() throws Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("counters") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -781,7 +799,8 @@ public void testJobAttempts() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1") .path("mapreduce").path("jobs").path(jobId).path("jobattempts") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobAttempts"); @@ -799,7 +818,8 @@ public void testJobAttemptsSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1") .path("mapreduce").path("jobs").path(jobId).path("jobattempts/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobAttempts"); @@ -817,7 +837,8 @@ public void testJobAttemptsDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1") .path("mapreduce").path("jobs").path(jobId).path("jobattempts") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobAttempts"); @@ -835,7 +856,8 @@ public void testJobAttemptsXML() throws Exception { ClientResponse response = r.path("ws").path("v1") .path("mapreduce").path("jobs").path(jobId).path("jobattempts") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesTasks.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesTasks.java index 242c243985..ab4d818f33 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesTasks.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/webapp/TestAMWebServicesTasks.java @@ -32,6 +32,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.mapreduce.TaskID; import org.apache.hadoop.mapreduce.v2.api.records.JobId; 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") .path("jobs").path(jobId).path("tasks") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -141,7 +143,8 @@ public void testTasksDefault() throws JSONException, Exception { String jobId = MRApps.toString(id); ClientResponse response = r.path("ws").path("v1").path("mapreduce") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -161,7 +164,8 @@ public void testTasksSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -182,7 +186,8 @@ public void testTasksXML() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -206,7 +211,8 @@ public void testTasksQueryMap() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").queryParam("type", type) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -226,7 +232,8 @@ public void testTasksQueryReduce() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").queryParam("type", type) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -253,7 +260,8 @@ public void testTasksQueryInvalid() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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") .path("jobs").path(jobId).path("tasks").path(tid) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("task"); @@ -303,7 +312,8 @@ public void testTaskIdSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid + "/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("task"); @@ -324,7 +334,8 @@ public void testTaskIdDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("task"); @@ -347,7 +358,8 @@ public void testTaskIdBogus() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -381,7 +393,8 @@ public void testTaskIdNonExist() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -413,7 +426,8 @@ public void testTaskIdInvalid() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -447,7 +461,8 @@ public void testTaskIdInvalid2() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -481,7 +496,8 @@ public void testTaskIdInvalid3() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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) .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -627,7 +644,8 @@ public void testTaskIdCounters() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid).path("counters") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobTaskCounters"); @@ -648,7 +666,8 @@ public void testTaskIdCountersSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid).path("counters/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobTaskCounters"); @@ -669,7 +688,8 @@ public void testTaskIdCountersDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid).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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobTaskCounters"); @@ -690,7 +710,8 @@ public void testJobTaskCountersXML() throws Exception { ClientResponse response = r.path("ws").path("v1").path("mapreduce") .path("jobs").path(jobId).path("tasks").path(tid).path("counters") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/webapp/HsWebServices.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/webapp/HsWebServices.java index c95ce3e557..dda237db83 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/webapp/HsWebServices.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/webapp/HsWebServices.java @@ -34,6 +34,7 @@ import javax.ws.rs.core.UriInfo; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.mapreduce.JobACL; import org.apache.hadoop.mapreduce.v2.api.records.AMInfo; import org.apache.hadoop.mapreduce.v2.api.records.JobState; @@ -110,14 +111,16 @@ void setResponse(HttpServletResponse response) { } @GET - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, + MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 }) public HistoryInfo get() { return getHistoryInfo(); } @GET @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() { init(); return new HistoryInfo(); @@ -125,7 +128,8 @@ public HistoryInfo getHistoryInfo() { @GET @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, @QueryParam("limit") String count, @QueryParam("state") String stateQuery, @@ -215,7 +219,8 @@ public JobsInfo getJobs(@QueryParam("user") String userQuery, @GET @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, @PathParam("jobid") String jid) { @@ -227,7 +232,8 @@ public JobInfo getJob(@Context HttpServletRequest hsr, @GET @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) { init(); @@ -244,7 +250,8 @@ public AMAttemptsInfo getJobAttempts(@PathParam("jobid") String jid) { @GET @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, @PathParam("jobid") String jid) { @@ -256,7 +263,8 @@ public JobCounterInfo getJobCounters(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid) { @@ -275,7 +283,8 @@ public ConfInfo getJobConf(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid, @QueryParam("type") String type) { @@ -302,7 +311,8 @@ public TasksInfo getJobTasks(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid, @PathParam("taskid") String tid) { @@ -316,7 +326,8 @@ public TaskInfo getJobTask(@Context HttpServletRequest hsr, @GET @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( @Context HttpServletRequest hsr, @PathParam("jobid") String jid, @PathParam("taskid") String tid) { @@ -337,7 +348,8 @@ public JobTaskCounterInfo getSingleTaskCounters( @GET @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, @PathParam("jobid") String jid, @PathParam("taskid") String tid) { @@ -360,7 +372,8 @@ public TaskAttemptsInfo getJobTaskAttempts(@Context HttpServletRequest hsr, @GET @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, @PathParam("jobid") String jid, @PathParam("taskid") String tid, @PathParam("attemptid") String attId) { @@ -380,7 +393,8 @@ public TaskAttemptInfo getJobTaskAttemptId(@Context HttpServletRequest hsr, @GET @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( @Context HttpServletRequest hsr, @PathParam("jobid") String jid, @PathParam("taskid") String tid, @PathParam("attemptid") String attId) { diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServices.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServices.java index ab812bb816..64fd2cae92 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServices.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServices.java @@ -29,6 +29,7 @@ import javax.xml.parsers.DocumentBuilderFactory; 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.hs.HistoryContext; import org.apache.hadoop.mapreduce.v2.hs.JobHistory; @@ -116,7 +117,8 @@ public void testHS() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("history") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyHSInfo(json.getJSONObject("historyInfo"), appContext); @@ -127,7 +129,8 @@ public void testHSSlash() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("history/") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyHSInfo(json.getJSONObject("historyInfo"), appContext); @@ -138,7 +141,8 @@ public void testHSDefault() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("history/") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyHSInfo(json.getJSONObject("historyInfo"), appContext); @@ -149,7 +153,8 @@ public void testHSXML() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("history") .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); verifyHSInfoXML(xml, appContext); } @@ -160,7 +165,8 @@ public void testInfo() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("info").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); assertEquals("incorrect number of elements", 1, json.length()); verifyHSInfo(json.getJSONObject("historyInfo"), appContext); @@ -172,7 +178,8 @@ public void testInfoSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("info/").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); assertEquals("incorrect number of elements", 1, json.length()); verifyHSInfo(json.getJSONObject("historyInfo"), appContext); @@ -183,7 +190,8 @@ public void testInfoDefault() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("history") .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); assertEquals("incorrect number of elements", 1, json.length()); verifyHSInfo(json.getJSONObject("historyInfo"), appContext); @@ -195,7 +203,8 @@ public void testInfoXML() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("info/").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); verifyHSInfoXML(xml, appContext); } diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesAttempts.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesAttempts.java index 38058b6e66..ddbe23f698 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesAttempts.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesAttempts.java @@ -35,6 +35,7 @@ import javax.xml.parsers.DocumentBuilderFactory; 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.TaskAttemptId; 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("attempts").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); verifyHsTaskAttempts(json, task); } @@ -157,7 +159,8 @@ public void testTaskAttemptsSlash() throws JSONException, Exception { .path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid) .path("attempts/").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); verifyHsTaskAttempts(json, task); } @@ -176,7 +179,8 @@ public void testTaskAttemptsDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid) .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); verifyHsTaskAttempts(json, task); } @@ -197,7 +201,8 @@ public void testTaskAttemptsXML() throws JSONException, Exception { .path("attempts").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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -232,7 +237,8 @@ public void testTaskAttemptId() throws JSONException, Exception { .path("mapreduce").path("jobs").path(jobId).path("tasks") .path(tid).path("attempts").path(attid) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("taskAttempt"); @@ -261,7 +267,8 @@ public void testTaskAttemptIdSlash() throws JSONException, Exception { .path("mapreduce").path("jobs").path(jobId).path("tasks") .path(tid).path("attempts").path(attid + "/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("taskAttempt"); @@ -289,7 +296,8 @@ public void testTaskAttemptIdDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("tasks") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("taskAttempt"); @@ -317,7 +325,8 @@ public void testTaskAttemptIdXML() throws JSONException, Exception { .path(tid).path("attempts").path(attid) .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -394,7 +403,8 @@ private void testTaskAttemptIdErrorGeneric(String attid, String error) } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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(tid).path("attempts").path(attid).path("counters") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobTaskAttemptCounters"); @@ -601,7 +612,8 @@ public void testTaskAttemptIdXMLCounters() throws JSONException, Exception { .path(tid).path("attempts").path(attid).path("counters") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobConf.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobConf.java index 53c5adc080..86203ce519 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobConf.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobConf.java @@ -39,6 +39,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.mapreduce.MRJobConfig; import org.apache.hadoop.mapreduce.v2.api.records.JobId; import org.apache.hadoop.mapreduce.v2.app.AppContext; @@ -167,7 +168,8 @@ public void testJobConf() throws JSONException, Exception { .path("mapreduce") .path("jobs").path(jobId).path("conf") .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); assertEquals("incorrect number of elements", 1, json.length()); 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") .path("jobs").path(jobId).path("conf/") .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); assertEquals("incorrect number of elements", 1, json.length()); 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") .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); assertEquals("incorrect number of elements", 1, json.length()); 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") .path("jobs").path(jobId).path("conf") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobs.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobs.java index 665815bf47..9fe87fd267 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobs.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobs.java @@ -36,6 +36,7 @@ import javax.xml.parsers.DocumentBuilderFactory; 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.JobId; 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") .path("mapreduce").path("jobs").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -145,7 +147,8 @@ public void testJobsSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs/").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -162,7 +165,8 @@ public void testJobsDefault() throws JSONException, Exception { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("history") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -180,7 +184,8 @@ public void testJobsXML() throws Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -271,7 +276,8 @@ public void testJobId() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("job"); @@ -290,7 +296,8 @@ public void testJobIdSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId + "/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("job"); @@ -308,7 +315,8 @@ public void testJobIdDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("job"); @@ -328,7 +336,8 @@ public void testJobIdNonExist() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -356,7 +365,8 @@ public void testJobIdInvalid() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -380,7 +390,8 @@ public void testJobIdInvalidDefault() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -404,7 +415,8 @@ public void testJobIdInvalidXML() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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); System.out.println(msg); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); @@ -443,7 +455,8 @@ public void testJobIdInvalidBogus() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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") .path("mapreduce").path("jobs").path(jobId) .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -493,7 +507,8 @@ public void testJobCounters() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("counters") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobCounters"); @@ -511,7 +526,8 @@ public void testJobCountersSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("counters/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobCounters"); @@ -549,7 +565,8 @@ protected void configureServlets() { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("counters/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobCounters"); @@ -569,7 +586,8 @@ public void testJobCountersDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobCounters"); @@ -587,7 +605,8 @@ public void testJobCountersXML() throws Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("counters") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -686,7 +705,8 @@ public void testJobAttempts() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("jobattempts") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobAttempts"); @@ -704,7 +724,8 @@ public void testJobAttemptsSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("jobattempts/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobAttempts"); @@ -722,7 +743,8 @@ public void testJobAttemptsDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("jobattempts") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobAttempts"); @@ -740,7 +762,8 @@ public void testJobAttemptsXML() throws Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("jobattempts") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobsQuery.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobsQuery.java index c452fd9ffd..e77cfb1d5b 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobsQuery.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesJobsQuery.java @@ -32,6 +32,7 @@ import javax.ws.rs.core.MediaType; 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.JobState; 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()) .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); assertEquals("incorrect number of elements", 1, json.length()); assertEquals("jobs is not empty", @@ -152,7 +154,8 @@ public void testJobsQueryState() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").queryParam("state", queryState) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -172,7 +175,8 @@ public void testJobsQueryStateInvalid() throws JSONException, Exception { .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); 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") .path("mapreduce").path("jobs").queryParam("user", "bogus") .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); assertEquals("incorrect number of elements", 1, json.length()); assertEquals("jobs is not empty", @@ -210,7 +215,8 @@ public void testJobsQueryUser() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").queryParam("user", "mock") .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); System.out.println(json.toString()); @@ -230,7 +236,8 @@ public void testJobsQueryLimit() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").queryParam("limit", "2") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -248,7 +255,8 @@ public void testJobsQueryLimitInvalid() throws JSONException, Exception { .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); 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") .path("mapreduce").path("jobs").queryParam("queue", "mockqueue") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -283,7 +292,8 @@ public void testJobsQueryQueueNonExist() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").queryParam("queue", "bogus") .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); assertEquals("incorrect number of elements", 1, json.length()); assertEquals("jobs is not empty", @@ -299,7 +309,8 @@ public void testJobsQueryStartTimeEnd() throws JSONException, Exception { .path("mapreduce").path("jobs") .queryParam("startedTimeEnd", String.valueOf(now)) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -316,7 +327,8 @@ public void testJobsQueryStartTimeBegin() throws JSONException, Exception { .path("mapreduce").path("jobs") .queryParam("startedTimeBegin", String.valueOf(now)) .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); assertEquals("incorrect number of elements", 1, json.length()); assertEquals("jobs is not empty", @@ -343,7 +355,8 @@ public void testJobsQueryStartTimeBeginEnd() throws JSONException, Exception { .queryParam("startedTimeBegin", String.valueOf(40000)) .queryParam("startedTimeEnd", String.valueOf(midStartTime)) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -362,7 +375,8 @@ public void testJobsQueryStartTimeBeginEndInvalid() throws JSONException, .queryParam("startedTimeEnd", String.valueOf(40000)) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -388,7 +402,8 @@ public void testJobsQueryStartTimeInvalidformat() throws JSONException, .path("mapreduce").path("jobs").queryParam("startedTimeBegin", "efsd") .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -414,7 +429,8 @@ public void testJobsQueryStartTimeEndInvalidformat() throws JSONException, .path("mapreduce").path("jobs").queryParam("startedTimeEnd", "efsd") .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -440,7 +456,8 @@ public void testJobsQueryStartTimeNegative() throws JSONException, Exception { .queryParam("startedTimeBegin", String.valueOf(-1000)) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -466,7 +483,8 @@ public void testJobsQueryStartTimeEndNegative() throws JSONException, .queryParam("startedTimeEnd", String.valueOf(-1000)) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -490,7 +508,8 @@ public void testJobsQueryFinishTimeEndNegative() throws JSONException, .queryParam("finishedTimeEnd", String.valueOf(-1000)) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -514,7 +533,8 @@ public void testJobsQueryFinishTimeBeginNegative() throws JSONException, .queryParam("finishedTimeBegin", String.valueOf(-1000)) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -541,7 +561,8 @@ public void testJobsQueryFinishTimeBeginEndInvalid() throws JSONException, .queryParam("finishedTimeEnd", String.valueOf(40000)) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -567,7 +588,8 @@ public void testJobsQueryFinishTimeInvalidformat() throws JSONException, .path("mapreduce").path("jobs").queryParam("finishedTimeBegin", "efsd") .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -593,7 +615,8 @@ public void testJobsQueryFinishTimeEndInvalidformat() throws JSONException, .path("mapreduce").path("jobs").queryParam("finishedTimeEnd", "efsd") .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -620,7 +643,8 @@ public void testJobsQueryFinishTimeBegin() throws JSONException, Exception { .path("mapreduce").path("jobs") .queryParam("finishedTimeBegin", String.valueOf(now)) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); @@ -637,7 +661,8 @@ public void testJobsQueryFinishTimeEnd() throws JSONException, Exception { .path("mapreduce").path("jobs") .queryParam("finishedTimeEnd", String.valueOf(now)) .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); assertEquals("incorrect number of elements", 1, json.length()); assertEquals("jobs is not empty", @@ -665,7 +690,8 @@ public void testJobsQueryFinishTimeBeginEnd() throws JSONException, Exception { .queryParam("finishedTimeBegin", String.valueOf(40000)) .queryParam("finishedTimeEnd", String.valueOf(midFinishTime)) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject jobs = json.getJSONObject("jobs"); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesTasks.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesTasks.java index 0dbf29e8c3..867ed618ec 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesTasks.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/webapp/TestHsWebServicesTasks.java @@ -34,6 +34,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.http.JettyUtils; import org.apache.hadoop.mapreduce.TaskID; import org.apache.hadoop.mapreduce.v2.api.records.JobId; 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") .path("mapreduce").path("jobs").path(jobId).path("tasks") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -151,7 +153,8 @@ public void testTasksDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -171,7 +174,8 @@ public void testTasksSlash() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("tasks/") .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -192,7 +196,8 @@ public void testTasksXML() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("tasks") .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); @@ -217,7 +222,8 @@ public void testTasksQueryMap() throws JSONException, Exception { .path("mapreduce").path("jobs").path(jobId).path("tasks") .queryParam("type", type).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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -238,7 +244,8 @@ public void testTasksQueryReduce() throws JSONException, Exception { .path("mapreduce").path("jobs").path(jobId).path("tasks") .queryParam("type", type).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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject tasks = json.getJSONObject("tasks"); @@ -265,7 +272,8 @@ public void testTasksQueryInvalid() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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") .path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("task"); @@ -316,7 +325,8 @@ public void testTaskIdSlash() throws JSONException, Exception { .path("mapreduce").path("jobs").path(jobId).path("tasks") .path(tid + "/").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("task"); @@ -337,7 +347,8 @@ public void testTaskIdDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid) .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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("task"); @@ -360,7 +371,8 @@ public void testTaskIdBogus() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -394,7 +406,8 @@ public void testTaskIdNonExist() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -426,7 +439,8 @@ public void testTaskIdInvalid() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -460,7 +474,8 @@ public void testTaskIdInvalid2() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); assertEquals("incorrect number of elements", 3, exception.length()); @@ -494,7 +509,8 @@ public void testTaskIdInvalid3() throws JSONException, Exception { } catch (UniformInterfaceException ue) { ClientResponse response = ue.getResponse(); 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 exception = msg.getJSONObject("RemoteException"); 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) .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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 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("counters").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); assertEquals("incorrect number of elements", 1, json.length()); 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("counters/").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); assertEquals("incorrect number of elements", 1, json.length()); JSONObject info = json.getJSONObject("jobTaskCounters"); @@ -681,7 +700,8 @@ public void testTaskIdCountersDefault() throws JSONException, Exception { ClientResponse response = r.path("ws").path("v1").path("history") .path("mapreduce").path("jobs").path(jobId).path("tasks").path(tid) .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); assertEquals("incorrect number of elements", 1, json.length()); 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("counters").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); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/NotificationTestCase.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/NotificationTestCase.java index 1f657cfc1e..5df1af5cce 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/NotificationTestCase.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/NotificationTestCase.java @@ -18,9 +18,10 @@ package org.apache.hadoop.mapred; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.servlet.Context; -import org.mortbay.jetty.servlet.ServletHolder; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.io.Text; @@ -76,7 +77,8 @@ private void startHttpServer() throws Exception { } webServer = new Server(0); - Context context = new Context(webServer, contextPath); + ServletContextHandler context = + new ServletContextHandler(webServer, contextPath); // create servlet handler context.addServlet(new ServletHolder(new NotificationServlet()), @@ -84,7 +86,7 @@ private void startHttpServer() throws Exception { // Start webServer webServer.start(); - port = webServer.getConnectors()[0].getLocalPort(); + port = ((ServerConnector)webServer.getConnectors()[0]).getLocalPort(); } diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/MiniHadoopClusterManager.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/MiniHadoopClusterManager.java index 2e8ba5e627..3cc73b5aba 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/MiniHadoopClusterManager.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/MiniHadoopClusterManager.java @@ -45,7 +45,7 @@ import org.apache.hadoop.mapreduce.v2.jobhistory.JHAdminConfig; import org.apache.hadoop.yarn.conf.YarnConfiguration; 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 diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java index 4c1870970c..9547062db5 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/main/java/org/apache/hadoop/mapred/ShuffleHandler.java @@ -127,7 +127,7 @@ import org.jboss.netty.handler.ssl.SslHandler; import org.jboss.netty.handler.stream.ChunkedWriteHandler; 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.base.Charsets; @@ -1137,13 +1137,15 @@ protected void setResponseHeaders(HttpResponse response, if (LOG.isDebugEnabled()) { LOG.debug("Setting connection close header..."); } - response.headers().set(HttpHeaders.CONNECTION, CONNECTION_CLOSE); + response.headers().set(HttpHeader.CONNECTION.asString(), + CONNECTION_CLOSE); } else { - response.headers().set(HttpHeaders.CONTENT_LENGTH, + response.headers().set(HttpHeader.CONTENT_LENGTH.asString(), String.valueOf(contentLength)); - response.headers().set(HttpHeaders.CONNECTION, HttpHeaders.KEEP_ALIVE); - response.headers().set(HttpHeaders.KEEP_ALIVE, "timeout=" - + connectionKeepAliveTimeOut); + response.headers().set(HttpHeader.CONNECTION.asString(), + HttpHeader.KEEP_ALIVE.asString()); + response.headers().set(HttpHeader.KEEP_ALIVE.asString(), + "timeout=" + connectionKeepAliveTimeOut); LOG.info("Content Length in shuffle : " + contentLength); } } diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/test/java/org/apache/hadoop/mapred/TestShuffleHandler.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/test/java/org/apache/hadoop/mapred/TestShuffleHandler.java index a927bf4f5e..1e439374b5 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/test/java/org/apache/hadoop/mapred/TestShuffleHandler.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-shuffle/src/test/java/org/apache/hadoop/mapred/TestShuffleHandler.java @@ -92,7 +92,7 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.mockito.Mockito; -import org.mortbay.jetty.HttpHeaders; +import org.eclipse.jetty.http.HttpHeader; public class TestShuffleHandler { static final long MiB = 1024 * 1024; @@ -299,7 +299,8 @@ protected void sendError(ChannelHandlerContext ctx, String message, conn.connect(); DataInputStream input = new DataInputStream(conn.getInputStream()); 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(); header.readFields(input); input.close(); @@ -409,15 +410,15 @@ protected void sendError(ChannelHandlerContext ctx, String message, + "map=attempt_12345_1_m_1_0"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty(ShuffleHeader.HTTP_HEADER_NAME, - ShuffleHeader.DEFAULT_HTTP_HEADER_NAME); + ShuffleHeader.DEFAULT_HTTP_HEADER_NAME); conn.setRequestProperty(ShuffleHeader.HTTP_HEADER_VERSION, - ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION); + ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION); conn.connect(); DataInputStream input = new DataInputStream(conn.getInputStream()); - Assert.assertEquals(HttpHeaders.KEEP_ALIVE, - conn.getHeaderField(HttpHeaders.CONNECTION)); + Assert.assertEquals(HttpHeader.KEEP_ALIVE.asString(), + conn.getHeaderField(HttpHeader.CONNECTION.asString())); Assert.assertEquals("timeout=1", - conn.getHeaderField(HttpHeaders.KEEP_ALIVE)); + conn.getHeaderField(HttpHeader.KEEP_ALIVE.asString())); Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode()); ShuffleHeader header = new ShuffleHeader(); header.readFields(input); @@ -429,15 +430,15 @@ protected void sendError(ChannelHandlerContext ctx, String message, + "map=attempt_12345_1_m_1_0&keepAlive=true"); conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty(ShuffleHeader.HTTP_HEADER_NAME, - ShuffleHeader.DEFAULT_HTTP_HEADER_NAME); + ShuffleHeader.DEFAULT_HTTP_HEADER_NAME); conn.setRequestProperty(ShuffleHeader.HTTP_HEADER_VERSION, - ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION); + ShuffleHeader.DEFAULT_HTTP_HEADER_VERSION); conn.connect(); input = new DataInputStream(conn.getInputStream()); - Assert.assertEquals(HttpHeaders.KEEP_ALIVE, - conn.getHeaderField(HttpHeaders.CONNECTION)); + Assert.assertEquals(HttpHeader.KEEP_ALIVE.asString(), + conn.getHeaderField(HttpHeader.CONNECTION.asString())); Assert.assertEquals("timeout=1", - conn.getHeaderField(HttpHeaders.KEEP_ALIVE)); + conn.getHeaderField(HttpHeader.KEEP_ALIVE.asString())); Assert.assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode()); header = new ShuffleHeader(); header.readFields(input); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/pom.xml b/hadoop-mapreduce-project/hadoop-mapreduce-client/pom.xml index e71d21f26e..b5041bdebc 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/pom.xml +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/pom.xml @@ -46,8 +46,8 @@ avro - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server org.apache.ant diff --git a/hadoop-mapreduce-project/pom.xml b/hadoop-mapreduce-project/pom.xml index 5fd346d2c7..a1b437e227 100644 --- a/hadoop-mapreduce-project/pom.xml +++ b/hadoop-mapreduce-project/pom.xml @@ -52,8 +52,8 @@ avro - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server org.apache.ant diff --git a/hadoop-maven-plugins/pom.xml b/hadoop-maven-plugins/pom.xml index 48ee5d55d3..f82d750a5e 100644 --- a/hadoop-maven-plugins/pom.xml +++ b/hadoop-maven-plugins/pom.xml @@ -55,6 +55,10 @@ org.codehaus.jackson jackson-mapper-asl + + commons-io + commons-io + diff --git a/hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/resourcegz/ResourceGzMojo.java b/hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/resourcegz/ResourceGzMojo.java new file mode 100644 index 0000000000..5c9e26e6ba --- /dev/null +++ b/hadoop-maven-plugins/src/main/java/org/apache/hadoop/maven/plugin/resourcegz/ResourceGzMojo.java @@ -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 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 { + 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; + } + } +} diff --git a/hadoop-project/pom.xml b/hadoop-project/pom.xml index f914f92cfb..7e3b1cc7bc 100644 --- a/hadoop-project/pom.xml +++ b/hadoop-project/pom.xml @@ -35,7 +35,7 @@ false true - 6.1.26 + 9.3.11.v20160721 _ _ @@ -518,28 +518,38 @@ javax.servlet - servlet-api - 2.5 + javax.servlet-api + 3.1.0 - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server ${jetty.version} - org.mortbay.jetty - servlet-api + org.eclipse.jetty + javax.servlet-api - org.mortbay.jetty + org.eclipse.jetty jetty-util ${jetty.version} - org.mortbay.jetty - jetty-sslengine + org.eclipse.jetty + jetty-servlet + ${jetty.version} + + + org.eclipse.jetty + jetty-webapp + ${jetty.version} + + + org.eclipse.jetty + jetty-util-ajax ${jetty.version} @@ -636,11 +646,23 @@ jersey-test-framework-core ${jersey.version} test + + + javax.servlet + javax.servlet-api + + com.sun.jersey.jersey-test-framework jersey-test-framework-grizzly2 ${jersey.version} + + + javax.servlet + javax.servlet-api + + @@ -668,7 +690,7 @@ - org.mortbay.jetty + org.eclipse.jetty jetty-servlet-tester ${jetty.version} @@ -687,7 +709,7 @@ javax.servlet - servlet-api + javax.servlet-api @@ -847,6 +869,12 @@ org.mock-server mockserver-netty 3.9.2 + + + javax.servlet + javax.servlet-api + + org.apache.avro diff --git a/hadoop-tools/hadoop-azure-datalake/pom.xml b/hadoop-tools/hadoop-azure-datalake/pom.xml index e1a0bfeacc..9a15b04eb1 100644 --- a/hadoop-tools/hadoop-azure-datalake/pom.xml +++ b/hadoop-tools/hadoop-azure-datalake/pom.xml @@ -135,7 +135,7 @@ hadoop-client - servlet-api + javax.servlet-api javax.servlet diff --git a/hadoop-tools/hadoop-azure/pom.xml b/hadoop-tools/hadoop-azure/pom.xml index d8121e2695..c4b45f4aeb 100644 --- a/hadoop-tools/hadoop-azure/pom.xml +++ b/hadoop-tools/hadoop-azure/pom.xml @@ -164,13 +164,18 @@ azure-storage compile - com.google.guava guava compile + + + org.eclipse.jetty + jetty-util-ajax + compile + diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/AzureNativeFileSystemStore.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/AzureNativeFileSystemStore.java index eaca82e5bb..3e864a4ddf 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/AzureNativeFileSystemStore.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/AzureNativeFileSystemStore.java @@ -59,7 +59,7 @@ import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.fs.permission.PermissionStatus; 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.LoggerFactory; diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/BlockBlobAppendStream.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/BlockBlobAppendStream.java index e419a3bb5b..a7e286c917 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/BlockBlobAppendStream.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azure/BlockBlobAppendStream.java @@ -40,7 +40,7 @@ import org.apache.hadoop.fs.FSExceptionMessages; import org.apache.commons.codec.binary.Base64; 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.LoggerFactory; @@ -760,7 +760,7 @@ public void run() { dataPayload.length, new BlobRequestOptions(), opContext); break; } 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++; lastLocalException = new IOException("Encountered Exception while uploading block", ioe); try { @@ -814,7 +814,7 @@ public void run() { Thread.currentThread().interrupt(); } - Log.debug("Attempting to renew append lease on {}", key); + Log.getLog().debug("Attempting to renew append lease on {}", key); try { if (!leaseFreed) { diff --git a/hadoop-tools/hadoop-sls/pom.xml b/hadoop-tools/hadoop-sls/pom.xml index da70b24593..b84f5fc440 100644 --- a/hadoop-tools/hadoop-sls/pom.xml +++ b/hadoop-tools/hadoop-sls/pom.xml @@ -55,18 +55,18 @@ compile - org.mortbay.jetty - jetty + org.eclipse.jetty + jetty-server provided - org.mortbay.jetty - servlet-api + org.eclipse.jetty + javax.servlet-api - org.mortbay.jetty + org.eclipse.jetty jetty-util provided diff --git a/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/web/SLSWebApp.java b/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/web/SLSWebApp.java index e1526965db..abdf1060af 100644 --- a/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/web/SLSWebApp.java +++ b/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/web/SLSWebApp.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Set; +import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -38,16 +39,16 @@ import org.apache.hadoop.yarn.sls.scheduler.FairSchedulerMetrics; import org.apache.hadoop.yarn.sls.scheduler.SchedulerMetrics; import org.apache.hadoop.yarn.sls.scheduler.SchedulerWrapper; -import org.mortbay.jetty.Handler; -import org.mortbay.jetty.Request; -import org.mortbay.jetty.Server; -import org.mortbay.jetty.handler.AbstractHandler; -import org.mortbay.jetty.handler.ResourceHandler; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; import com.codahale.metrics.Counter; import com.codahale.metrics.Gauge; import com.codahale.metrics.Histogram; import com.codahale.metrics.MetricRegistry; +import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.handler.ResourceHandler; @Private @Unstable @@ -121,8 +122,10 @@ public void start() throws Exception { Handler handler = new AbstractHandler() { @Override - public void handle(String target, HttpServletRequest request, - HttpServletResponse response, int dispatch) { + public void handle(String target, Request baseRequest, + HttpServletRequest request, + HttpServletResponse response) + throws IOException, ServletException { try{ // timeunit int timeunit = 1000; // second, divide millionsecond / 1000 @@ -144,7 +147,7 @@ public void handle(String target, HttpServletRequest request, // js/css request if (target.startsWith("/js") || target.startsWith("/css")) { response.setCharacterEncoding("utf-8"); - staticHandler.handle(target, request, response, dispatch); + staticHandler.handle(target, baseRequest, request, response); } else // json request if (target.equals("/simulateMetrics")) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java index c4bb3ced94..8772fdc872 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClient.java @@ -99,7 +99,7 @@ import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import org.mortbay.log.Log; +import org.eclipse.jetty.util.log.Log; import com.google.common.base.Supplier; @@ -654,7 +654,8 @@ public void testAMRMClientMatchStorage() throws YarnException, IOException { int iterationsLeft = 3; while (allocatedContainerCount < 2 && 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); assertEquals(0, amClient.ask.size()); assertEquals(0, amClient.release.size()); @@ -822,7 +823,8 @@ private int getAllocatedContainersNumber( throws YarnException, IOException { int allocatedContainerCount = 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); assertEquals(0, amClient.ask.size()); assertEquals(0, amClient.release.size()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java index c4d2e09447..c1cabb074d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java @@ -84,7 +84,7 @@ import org.junit.Assert; import org.junit.Before; 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.Sets; @@ -325,11 +325,11 @@ public void testGetContainers() throws Exception { "http://host:2345", ""); pw.close(); String appReportStr = baos.toString("UTF-8"); - Log.info("ExpectedOutput"); - Log.info("["+appReportStr+"]"); - Log.info("OutputFrom command"); + Log.getLog().info("ExpectedOutput"); + Log.getLog().info("["+appReportStr+"]"); + Log.getLog().info("OutputFrom command"); String actualOutput = sysOutStream.toString("UTF-8"); - Log.info("["+actualOutput+"]"); + Log.getLog().info("["+actualOutput+"]"); Assert.assertEquals(appReportStr, actualOutput); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml index 8f31874934..f1be0987b9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml @@ -68,14 +68,14 @@ javax.servlet - servlet-api + javax.servlet-api commons-codec commons-codec - org.mortbay.jetty + org.eclipse.jetty jetty-util @@ -279,7 +279,18 @@ ${project.build.directory}/generated-sources/java - + + resource-gz + generate-resources + + resource-gz + + + ${basedir}/src/main/resources/webapps/static + ${basedir}/target/classes/webapps/static + js,css + + diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/js/jquery.dataTables.min.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/js/jquery.dataTables.min.js new file mode 100644 index 0000000000..61acb9b9ed --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/js/jquery.dataTables.min.js @@ -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=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=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;jb&&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=0;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d=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")[0];a.nTable.parentNode.insertBefore(b,a.nTable);a.nTableWrapper=i('

')[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")[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'):c===""?'':c+' ';var d=s.createElement("div");d.className=a.oClasses.sFilter;d.innerHTML="";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=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").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,d,e=a.aLengthMenu;if(e.length==2&&typeof e[0]==="object"&&typeof e[1]==="object"){c=0;for(d=e[0].length;c'+e[1][c]+""}else{c=0;for(d=e.length;c'+e[c]+""}b+=""; +e=s.createElement("div");if(!a.aanFeatures.l)e.id=a.sTableId+"_length";e.className=a.oClasses.sLength;e.innerHTML="";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;ca.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=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;d0){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()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()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()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.offsetHeightd.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;etd",b);j=Z(a,f);for(f=d=0;f0)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/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/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;m0&&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;b4096){for(var j=0,k=a.length;j4096;){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=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('
')[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=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=D(d);if(!m)for(e=a;et<"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=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;c0&&(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=parseInt(v,10)};l.fnIsDataTable=function(h){for(var n=l.settings,q=0;q'+o.sPrevious+''+o.sNext+"":'';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'+o.sFirst+''+o.sPrevious+''+o.sNext+''+o.sLast+"");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=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?''+h.fnFormatNumber(q)+ +"":''+h.fnFormatNumber(q)+"";q=0;for(o=Y.length;qn?1:0},"string-desc":function(h,n){return hn?-1:0},"html-pre":function(h){return h.replace(/<.*?>/g,"").toLowerCase()},"html-asc":function(h,n){return hn?1:0},"html-desc":function(h,n){return hn?-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")!=-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); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/js/jquery.dataTables.min.js.gz b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/dt-1.9.4/js/jquery.dataTables.min.js.gz deleted file mode 100644 index f18b55048c7e8defd228f1fd94d76945e9e8638e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21726 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 z+X?z{$3Ugl==0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
t
",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;be.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="
",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="

",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
","
"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-1.8.2.min.js.gz b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-1.8.2.min.js.gz deleted file mode 100644 index d2e3ec8a88fb10a3829507046135a57e6958c6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33430 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

hjyvz2Nr)tgCet_AtMwB?bOj+III7Wyasz=z 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").outerWidth(1).jquery||e.each(["Width","Height"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,"padding"+this))||0,r&&(n-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(n-=parseFloat(e.css(t,"margin"+this))||0)}),n}var i=r==="Width"?["Left","Right"]:["Top","Bottom"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+r]=function(n){return n===t?o["inner"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+"px")})},e.fn["outer"+r]=function(t,n){return typeof t!="number"?o["outer"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+"px")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement("div"));n.offsetHeight,e.extend(n.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart="onselectstart"in n,t.removeChild(n).style.display="none"}),function(){var t=/msie ([\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=parseFloat(t[1],10)===6}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetName,this),e.data(r,this.widgetFullName,this),this._on(this.element,{remove:function(e){e.target===r&&this.destroy()}}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n=="string"){i={},s=n.split("."),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u=9||!!t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return!0}})})(jQuery);(function(e,t){function h(e,t,n){return[parseInt(e[0],10)*(l.test(e[0])?t/100:1),parseInt(e[1],10)*(l.test(e[1])?n/100:1)]}function p(t,n){return parseInt(e.css(t,n),10)||0}e.ui=e.ui||{};var n,r=Math.max,i=Math.abs,s=Math.round,o=/left|center|right/,u=/top|center|bottom/,a=/[\+\-]\d+%?/,f=/^\w+/,l=/%$/,c=e.fn.position;e.position={scrollbarWidth:function(){if(n!==t)return n;var r,i,s=e("

"),o=s.children()[0];return e("body").append(s),r=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?"":t.element.css("overflow-x"),r=t.isWindow?"":t.element.css("overflow-y"),i=n==="scroll"||n==="auto"&&t.width0?"right":"center",vertical:u<0?"top":o>0?"bottom":"middle"};lr(i(o),i(u))?h.important="horizontal":h.important="vertical",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]==="left"?-t.elemWidth:t.my[0]==="right"?t.elemWidth:0,c=t.at[0]==="left"?t.targetWidth:t.at[0]==="right"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)a&&(v<0||v0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)10&&i<11,t.innerHTML="",n.removeChild(t)}(),e.uiBackCompat!==!1&&function(e){var n=e.fn.position;e.fn.position=function(r){if(!r||!r.offset)return n.call(this,r);var i=r.offset.split(" "),s=r.at.split(" ");return i.length===1&&(i[1]=i[0]),/^\d/.test(i[0])&&(i[0]="+"+i[0]),/^\d/.test(i[1])&&(i[1]="+"+i[1]),s.length===1&&(/left|center|right/.test(s[0])?s[1]="center":(s[1]=s[0],s[0]="center")),n.call(this,e.extend(r,{at:s[0]+i[0]+" "+s[1]+i[1],offset:t}))}}(jQuery)})(jQuery);(function(e,t){var n=0,r={},i={};r.height=r.paddingTop=r.paddingBottom=r.borderTopWidth=r.borderBottomWidth="hide",i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="show",e.widget("ui.accordion",{version:"1.9.1",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var t=this.accordionId="ui-accordion-"+(this.element.attr("id")||++n),r=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset"),this.headers=this.element.find(r.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this._hoverable(this.headers),this._focusable(this.headers),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").hide(),!r.collapsible&&(r.active===!1||r.active==null)&&(r.active=0),r.active<0&&(r.active+=this.headers.length),this.active=this._findActive(r.active).addClass("ui-accordion-header-active ui-state-active").toggleClass("ui-corner-all ui-corner-top"),this.active.next().addClass("ui-accordion-content-active").show(),this._createIcons(),this.refresh(),this.element.attr("role","tablist"),this.headers.attr("role","tab").each(function(n){var r=e(this),i=r.attr("id"),s=r.next(),o=s.attr("id");i||(i=t+"-header-"+n,r.attr("id",i)),o||(o=t+"-panel-"+n,s.attr("id",o)),r.attr("aria-controls",o),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._on(this.headers,{keydown:"_keydown"}),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._setupEvents(r.event)},_getCreateEventData:function(){return{header:this.active,content:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),e=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this.options.heightStyle!=="content"&&e.css("height","")},_setOption:function(e,t){if(e==="active"){this._activate(t);return}e==="event"&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),e==="collapsible"&&!t&&this.options.active===!1&&this._activate(0),e==="icons"&&(this._destroyIcons(),t&&this._createIcons()),e==="disabled"&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)},_keydown:function(t){if(t.altKey||t.ctrlKey)return;var n=e.ui.keyCode,r=this.headers.length,i=this.headers.index(t.target),s=!1;switch(t.keyCode){case n.RIGHT:case n.DOWN:s=this.headers[(i+1)%r];break;case n.LEFT:case n.UP:s=this.headers[(i-1+r)%r];break;case n.SPACE:case n.ENTER:this._eventHandler(t);break;case n.HOME:s=this.headers[0];break;case n.END:s=this.headers[r-1]}s&&(e(t.target).attr("tabIndex",-1),e(s).attr("tabIndex",0),s.focus(),t.preventDefault())},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t,n,r=this.options.heightStyle,i=this.element.parent();r==="fill"?(e.support.minHeight||(n=i.css("overflow"),i.css("overflow","hidden")),t=i.height(),this.element.siblings(":visible").each(function(){var n=e(this),r=n.css("position");if(r==="absolute"||r==="fixed")return;t-=n.outerHeight(!0)}),n&&i.css("overflow",n),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):r==="auto"&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).height("").height())}).height(t))},_activate:function(t){var n=this._findActive(t)[0];if(n===this.active[0])return;n=n||this.active[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return typeof t=="number"?this.headers.eq(t):e()},_setupEvents:function(t){var n={};if(!t)return;e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._on(this.headers,n)},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i[0]===r[0],o=s&&n.collapsible,u=o?e():i.next(),a=r.next(),f={oldHeader:r,oldPanel:a,newHeader:o?e():i,newPanel:u};t.preventDefault();if(s&&!n.collapsible||this._trigger("beforeActivate",t,f)===!1)return;n.active=o?!1:this.headers.index(i),this.active=s?e():i,this._toggle(f),r.removeClass("ui-accordion-header-active ui-state-active"),n.icons&&r.children(".ui-accordion-header-icon").removeClass(n.icons.activeHeader).addClass(n.icons.header),s||(i.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),n.icons&&i.children(".ui-accordion-header-icon").removeClass(n.icons.header).addClass(n.icons.activeHeader),i.next().addClass("ui-accordion-content-active"))},_toggle:function(t){var n=t.newPanel,r=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=n,this.prevHide=r,this.options.animate?this._animate(n,r,t):(r.hide(),n.show(),this._toggleComplete(t)),r.attr({"aria-expanded":"false","aria-hidden":"true"}),r.prev().attr("aria-selected","false"),n.length&&r.length?r.prev().attr("tabIndex",-1):n.length&&this.headers.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),n.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(e,t,n){var s,o,u,a=this,f=0,l=e.length&&(!t.length||e.index()",options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is("input,textarea")?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(i){if(this.element.prop("readOnly")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move("previousPage",i);break;case s.PAGE_DOWN:t=!0,this._move("nextPage",i);break;case s.UP:t=!0,this._keyEvent("previous",i);break;case s.DOWN:t=!0,this._keyEvent("next",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move("previousPage",r);break;case i.PAGE_DOWN:this._move("nextPage",r);break;case i.UP:this._keyEvent("previous",r);break;case i.DOWN:this._keyEvent("next",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e("
'+"";var z=N?'":"";for(var W=0;W<7;W++){var X=(W+T)%7;z+="=5?' class="ui-datepicker-week-end"':"")+">"+''+L[X]+""}U+=z+"";var V=this._getDaysInMonth(d,p);d==e.selectedYear&&p==e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,V));var J=(this._getFirstDayOfMonth(d,p)-T+7)%7,K=Math.ceil((J+V)/7),Q=f?this.maxRows>K?this.maxRows:K:K;this.maxRows=Q;var G=this._daylightSavingAdjust(new Date(d,p,1-J));for(var Y=0;Y";var Z=N?'":"";for(var W=0;W<7;W++){var et=M?M.apply(e.input?e.input[0]:null,[G]):[!0,""],tt=G.getMonth()!=p,nt=tt&&!D||!et[0]||c&&Gh;Z+='",G.setDate(G.getDate()+1),G=this._daylightSavingAdjust(G)}U+=Z+""}p++,p>11&&(p=0,d++),U+="
'+this._get(e,"weekHeader")+"
'+this._get(e,"calculateWeek")(G)+""+(tt&&!_?" ":nt?''+G.getDate()+"":''+G.getDate()+"")+"
"+(f?""+(o[0]>0&&I==o[1]-1?'
':""):""),F+=U}B+=F}return B+=x+($.ui.ie6&&!e.inline?'':""),e._keyEvent=!1,B},_generateMonthYearHeader:function(e,t,n,r,i,s,o,u){var a=this._get(e,"changeMonth"),f=this._get(e,"changeYear"),l=this._get(e,"showMonthAfterYear"),c='
',h="";if(s||!a)h+=''+o[t]+"";else{var p=r&&r.getFullYear()==n,d=i&&i.getFullYear()==n;h+='"}l||(c+=h+(s||!a||!f?" ":""));if(!e.yearshtml){e.yearshtml="";if(s||!f)c+=''+n+"";else{var m=this._get(e,"yearRange").split(":"),g=(new Date).getFullYear(),y=function(e){var t=e.match(/c[+-].*/)?n+parseInt(e.substring(1),10):e.match(/[+-].*/)?g+parseInt(e,10):parseInt(e,10);return isNaN(t)?g:t},b=y(m[0]),w=Math.max(b,y(m[1]||""));b=r?Math.max(b,r.getFullYear()):b,w=i?Math.min(w,i.getFullYear()):w,e.yearshtml+='",c+=e.yearshtml,e.yearshtml=null}}return c+=this._get(e,"yearSuffix"),l&&(c+=(s||!a||!f?" ":"")+h),c+="
",c},_adjustInstDate:function(e,t,n){var r=e.drawYear+(n=="Y"?t:0),i=e.drawMonth+(n=="M"?t:0),s=Math.min(e.selectedDay,this._getDaysInMonth(r,i))+(n=="D"?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(r,i,s)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),(n=="M"||n=="Y")&&this._notifyChange(e)},_restrictMinMax:function(e,t){var n=this._getMinMaxDate(e,"min"),r=this._getMinMaxDate(e,"max"),i=n&&tr?r:i,i},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return t==null?[1,1]:typeof t=="number"?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return(new Date(e,t,1)).getDay()},_canAdjustMonth:function(e,t,n,r){var i=this._getNumberOfMonths(e),s=this._daylightSavingAdjust(new Date(n,r+(t<0?t:i[0]*i[1]),1));return t<0&&s.setDate(this._getDaysInMonth(s.getFullYear(),s.getMonth())),this._isInRange(e,s)},_isInRange:function(e,t){var n=this._getMinMaxDate(e,"min"),r=this._getMinMaxDate(e,"max");return(!n||t.getTime()>=n.getTime())&&(!r||t.getTime()<=r.getTime())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t=typeof t!="string"?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,n,r){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var i=t?typeof t=="object"?t:this._daylightSavingAdjust(new Date(r,n,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),i,this._getFormatConfig(e))}}),$.fn.datepicker=function(e){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find(document.body).append($.datepicker.dpDiv),$.datepicker.initialized=!0);var t=Array.prototype.slice.call(arguments,1);return typeof e!="string"||e!="isDisabled"&&e!="getDate"&&e!="widget"?e=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this[0]].concat(t)):this.each(function(){typeof e=="string"?$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this].concat(t)):$.datepicker._attachDatepicker(this,e)}):$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this[0]].concat(t))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.9.1",window["DP_jQuery_"+dpuuid]=$})(jQuery);(function(e,t){var n="ui-dialog ui-widget ui-widget-content ui-corner-all ",r={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};e.widget("ui.dialog",{version:"1.9.1",options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var n=e(this).css(t).offset().top;n<0&&e(this).css("top",t.top-n)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.oldPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.options.title=this.options.title||this.originalTitle;var t=this,r=this.options,i=r.title||" ",s,o,u,a,f;s=(this.uiDialog=e("
")).addClass(n+r.dialogClass).css({display:"none",outline:0,zIndex:r.zIndex}).attr("tabIndex",-1).keydown(function(n){r.closeOnEscape&&!n.isDefaultPrevented()&&n.keyCode&&n.keyCode===e.ui.keyCode.ESCAPE&&(t.close(n),n.preventDefault())}).mousedown(function(e){t.moveToTop(!1,e)}).appendTo("body"),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(s),o=(this.uiDialogTitlebar=e("
")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").bind("mousedown",function(){s.focus()}).prependTo(s),u=e("").addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").click(function(e){e.preventDefault(),t.close(e)}).appendTo(o),(this.uiDialogTitlebarCloseText=e("")).addClass("ui-icon ui-icon-closethick").text(r.closeText).appendTo(u),a=e("").uniqueId().addClass("ui-dialog-title").html(i).prependTo(o),f=(this.uiDialogButtonPane=e("
")).addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),(this.uiButtonSet=e("
")).addClass("ui-dialog-buttonset").appendTo(f),s.attr({role:"dialog","aria-labelledby":a.attr("id")}),o.find("*").add(o).disableSelection(),this._hoverable(u),this._focusable(u),r.draggable&&e.fn.draggable&&this._makeDraggable(),r.resizable&&e.fn.resizable&&this._makeResizable(),this._createButtons(r.buttons),this._isOpen=!1,e.fn.bgiframe&&s.bgiframe(),this._on(s,{keydown:function(t){if(!r.modal||t.keyCode!==e.ui.keyCode.TAB)return;var n=e(":tabbable",s),i=n.filter(":first"),o=n.filter(":last");if(t.target===o[0]&&!t.shiftKey)return i.focus(1),!1;if(t.target===i[0]&&t.shiftKey)return o.focus(1),!1}})},_init:function(){this.options.autoOpen&&this.open()},_destroy:function(){var e,t=this.oldPosition;this.overlay&&this.overlay.destroy(),this.uiDialog.hide(),this.element.removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},close:function(t){var n=this,r,i;if(!this._isOpen)return;if(!1===this._trigger("beforeClose",t))return;return this._isOpen=!1,this.overlay&&this.overlay.destroy(),this.options.hide?this._hide(this.uiDialog,this.options.hide,function(){n._trigger("close",t)}):(this.uiDialog.hide(),this._trigger("close",t)),e.ui.dialog.overlay.resize(),this.options.modal&&(r=0,e(".ui-dialog").each(function(){this!==n.uiDialog[0]&&(i=e(this).css("z-index"),isNaN(i)||(r=Math.max(r,i)))}),e.ui.dialog.maxZ=r),this},isOpen:function(){return this._isOpen},moveToTop:function(t,n){var r=this.options,i;return r.modal&&!t||!r.stack&&!r.modal?this._trigger("focus",n):(r.zIndex>e.ui.dialog.maxZ&&(e.ui.dialog.maxZ=r.zIndex),this.overlay&&(e.ui.dialog.maxZ+=1,e.ui.dialog.overlay.maxZ=e.ui.dialog.maxZ,this.overlay.$el.css("z-index",e.ui.dialog.overlay.maxZ)),i={scrollTop:this.element.scrollTop(),scrollLeft:this.element.scrollLeft()},e.ui.dialog.maxZ+=1,this.uiDialog.css("z-index",e.ui.dialog.maxZ),this.element.attr(i),this._trigger("focus",n),this)},open:function(){if(this._isOpen)return;var t,n=this.options,r=this.uiDialog;return this._size(),this._position(n.position),r.show(n.show),this.overlay=n.modal?new e.ui.dialog.overlay(this):null,this.moveToTop(!0),t=this.element.find(":tabbable"),t.length||(t=this.uiDialogButtonPane.find(":tabbable"),t.length||(t=r)),t.eq(0).focus(),this._isOpen=!0,this._trigger("open"),this},_createButtons:function(t){var n=this,r=!1;this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),typeof t=="object"&&t!==null&&e.each(t,function(){return!(r=!0)}),r?(e.each(t,function(t,r){r=e.isFunction(r)?{click:r,text:t}:r;var i=e("").attr(r,!0).unbind("click").click(function(){r.click.apply(n.element[0],arguments)}).appendTo(n.uiButtonSet);e.fn.button&&i.button()}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog)):this.uiDialog.removeClass("ui-dialog-buttons")},_makeDraggable:function(){function r(e){return{position:e.position,offset:e.offset}}var t=this,n=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(n,i){e(this).addClass("ui-dialog-dragging"),t._trigger("dragStart",n,r(i))},drag:function(e,n){t._trigger("drag",e,r(n))},stop:function(i,s){n.position=[s.position.left-t.document.scrollLeft(),s.position.top-t.document.scrollTop()],e(this).removeClass("ui-dialog-dragging"),t._trigger("dragStop",i,r(s)),e.ui.dialog.overlay.resize()}})},_makeResizable:function(n){function u(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}n=n===t?this.options.resizable:n;var r=this,i=this.options,s=this.uiDialog.css("position"),o=typeof n=="string"?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:i.maxWidth,maxHeight:i.maxHeight,minWidth:i.minWidth,minHeight:this._minHeight(),handles:o,start:function(t,n){e(this).addClass("ui-dialog-resizing"),r._trigger("resizeStart",t,u(n))},resize:function(e,t){r._trigger("resize",e,u(t))},stop:function(t,n){e(this).removeClass("ui-dialog-resizing"),i.height=e(this).height(),i.width=e(this).width(),r._trigger("resizeStop",t,u(n)),e.ui.dialog.overlay.resize()}}).css("position",s).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var e=this.options;return e.height==="auto"?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(t){var n=[],r=[0,0],i;if(t){if(typeof t=="string"||typeof t=="object"&&"0"in t)n=t.split?t.split(" "):[t[0],t[1]],n.length===1&&(n[1]=n[0]),e.each(["left","top"],function(e,t){+n[e]===n[e]&&(r[e]=n[e],n[e]=t)}),t={my:n[0]+(r[0]<0?r[0]:"+"+r[0])+" "+n[1]+(r[1]<0?r[1]:"+"+r[1]),at:n.join(" ")};t=e.extend({},e.ui.dialog.prototype.options.position,t)}else t=e.ui.dialog.prototype.options.position;i=this.uiDialog.is(":visible"),i||this.uiDialog.show(),this.uiDialog.position(t),i||this.uiDialog.hide()},_setOptions:function(t){var n=this,s={},o=!1;e.each(t,function(e,t){n._setOption(e,t),e in r&&(o=!0),e in i&&(s[e]=t)}),o&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",s)},_setOption:function(t,r){var i,s,o=this.uiDialog;switch(t){case"buttons":this._createButtons(r);break;case"closeText":this.uiDialogTitlebarCloseText.text(""+r);break;case"dialogClass":o.removeClass(this.options.dialogClass).addClass(n+r);break;case"disabled":r?o.addClass("ui-dialog-disabled"):o.removeClass("ui-dialog-disabled");break;case"draggable":i=o.is(":data(draggable)"),i&&!r&&o.draggable("destroy"),!i&&r&&this._makeDraggable();break;case"position":this._position(r);break;case"resizable":s=o.is(":data(resizable)"),s&&!r&&o.resizable("destroy"),s&&typeof r=="string"&&o.resizable("option","handles",r),!s&&r!==!1&&this._makeResizable(r);break;case"title":e(".ui-dialog-title",this.uiDialogTitlebar).html(""+(r||" "))}this._super(t,r)},_size:function(){var t,n,r,i=this.options,s=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),i.minWidth>i.width&&(i.width=i.minWidth),t=this.uiDialog.css({height:"auto",width:i.width}).outerHeight(),n=Math.max(0,i.minHeight-t),i.height==="auto"?e.support.minHeight?this.element.css({minHeight:n,height:"auto"}):(this.uiDialog.show(),r=this.element.css("height","auto").height(),s||this.uiDialog.hide(),this.element.height(Math.max(r,n))):this.element.height(Math.max(i.height-t,0)),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),e.extend(e.ui.dialog,{uuid:0,maxZ:0,getTitleId:function(e){var t=e.attr("id");return t||(this.uuid+=1,t=this.uuid),"ui-dialog-title-"+t},overlay:function(t){this.$el=e.ui.dialog.overlay.create(t)}}),e.extend(e.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:e.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(e){return e+".dialog-overlay"}).join(" "),create:function(t){this.instances.length===0&&(setTimeout(function(){e.ui.dialog.overlay.instances.length&&e(document).bind(e.ui.dialog.overlay.events,function(t){if(e(t.target).zIndex()").addClass("ui-widget-overlay");return e(document).bind("keydown.dialog-overlay",function(r){var i=e.ui.dialog.overlay.instances;i.length!==0&&i[i.length-1]===n&&t.options.closeOnEscape&&!r.isDefaultPrevented()&&r.keyCode&&r.keyCode===e.ui.keyCode.ESCAPE&&(t.close(r),r.preventDefault())}),n.appendTo(document.body).css({width:this.width(),height:this.height()}),e.fn.bgiframe&&n.bgiframe(),this.instances.push(n),n},destroy:function(t){var n=e.inArray(t,this.instances),r=0;n!==-1&&this.oldInstances.push(this.instances.splice(n,1)[0]),this.instances.length===0&&e([document,window]).unbind(".dialog-overlay"),t.height(0).width(0).remove(),e.each(this.instances,function(){r=Math.max(r,this.css("z-index"))}),this.maxZ=r},height:function(){var t,n;return e.ui.ie?(t=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),n=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),t
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var n=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,n.cursorAt&&this._adjustOffsetFromHelper(n.cursorAt),n.containment&&this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,n){this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute");if(!n){var r=this._uiHash();if(this._trigger("drag",t,r)===!1)return this._mouseUp({}),!1;this.position=r.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var n=!1;e.ui.ddmanager&&!this.options.dropBehaviour&&(n=e.ui.ddmanager.drop(this,t)),this.dropped&&(n=this.dropped,this.dropped=!1);var r=this.element[0],i=!1;while(r&&(r=r.parentNode))r==document&&(i=!0);if(!i&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!n||this.options.revert=="valid"&&n||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,n)){var s=this;e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){s._trigger("stop",t)!==!1&&s._clear()})}else this._trigger("stop",t)!==!1&&this._clear();return!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){var n=!this.options.handle||!e(this.options.handle,this.element).length?!0:!1;return e(this.options.handle,this.element).find("*").andSelf().each(function(){this==t.target&&(n=!0)}),n},_createHelper:function(t){var n=this.options,r=e.isFunction(n.helper)?e(n.helper.apply(this.element[0],[t])):n.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return r.parents("body").length||r.appendTo(n.appendTo=="parent"?this.element[0].parentNode:n.appendTo),r[0]!=this.element[0]&&!/(fixed|absolute)/.test(r.css("position"))&&r.css("position","absolute"),r},_adjustOffsetFromHelper:function(t){typeof t=="string"&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&e.ui.ie)t={top:0,left:0};return{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var e=this.element.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t=this.options;t.containment=="parent"&&(t.containment=this.helper[0].parentNode);if(t.containment=="document"||t.containment=="window")this.containment=[t.containment=="document"?0:e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t.containment=="document"?0:e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(t.containment=="document"?0:e(window).scrollLeft())+e(t.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(t.containment=="document"?0:e(window).scrollTop())+(e(t.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(t.containment)&&t.containment.constructor!=Array){var n=e(t.containment),r=n[0];if(!r)return;var i=n.offset(),s=e(r).css("overflow")!="hidden";this.containment=[(parseInt(e(r).css("borderLeftWidth"),10)||0)+(parseInt(e(r).css("paddingLeft"),10)||0),(parseInt(e(r).css("borderTopWidth"),10)||0)+(parseInt(e(r).css("paddingTop"),10)||0),(s?Math.max(r.scrollWidth,r.offsetWidth):r.offsetWidth)-(parseInt(e(r).css("borderLeftWidth"),10)||0)-(parseInt(e(r).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(s?Math.max(r.scrollHeight,r.offsetHeight):r.offsetHeight)-(parseInt(e(r).css("borderTopWidth"),10)||0)-(parseInt(e(r).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=n}else t.containment.constructor==Array&&(this.containment=t.containment)},_convertPositionTo:function(t,n){n||(n=this.position);var r=t=="absolute"?1:-1,i=this.options,s=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(s[0].tagName);return{top:n.top+this.offset.relative.top*r+this.offset.parent.top*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():o?0:s.scrollTop())*r,left:n.left+this.offset.relative.left*r+this.offset.parent.left*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():o?0:s.scrollLeft())*r}},_generatePosition:function(t){var n=this.options,r=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,i=/(html|body)/i.test(r[0].tagName),s=t.pageX,o=t.pageY;if(this.originalPosition){var u;if(this.containment){if(this.relative_container){var a=this.relative_container.offset();u=[this.containment[0]+a.left,this.containment[1]+a.top,this.containment[2]+a.left,this.containment[3]+a.top]}else u=this.containment;t.pageX-this.offset.click.leftu[2]&&(s=u[2]+this.offset.click.left),t.pageY-this.offset.click.top>u[3]&&(o=u[3]+this.offset.click.top)}if(n.grid){var f=n.grid[1]?this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1]:this.originalPageY;o=u?f-this.offset.click.topu[3]?f-this.offset.click.topu[2]?l-this.offset.click.left=0;l--){var c=r.snapElements[l].left,h=c+r.snapElements[l].width,p=r.snapElements[l].top,d=p+r.snapElements[l].height;if(!(c-s=l&&o<=c||u>=l&&u<=c||oc)&&(i>=a&&i<=f||s>=a&&s<=f||if);default:return!1}},e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,n){var r=e.ui.ddmanager.droppables[t.options.scope]||[],i=n?n.type:null,s=(t.currentItem||t.element).find(":data(droppable)").andSelf();e:for(var o=0;oe?0:r.max")[0],c,h=t.each;l.style.cssText="background-color:rgba(1,1,1,.5)",f.rgba=l.style.backgroundColor.indexOf("rgba")>-1,h(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),o.fn=t.extend(o.prototype,{parse:function(r,i,s,a){if(r===n)return this._rgba=[null,null,null,null],this;if(r.jquery||r.nodeType)r=t(r).css(i),i=n;var f=this,l=t.type(r),v=this._rgba=[];i!==n&&(r=[r,i,s,a],l="array");if(l==="string")return this.parse(d(r)||c._default);if(l==="array")return h(u.rgba.props,function(e,t){v[t.idx]=p(r[t.idx],t)}),this;if(l==="object")return r instanceof o?h(u,function(e,t){r[t.cache]&&(f[t.cache]=r[t.cache].slice())}):h(u,function(t,n){var i=n.cache;h(n.props,function(e,t){if(!f[i]&&n.to){if(e==="alpha"||r[e]==null)return;f[i]=n.to(f._rgba)}f[i][t.idx]=p(r[e],t,!0)}),f[i]&&e.inArray(null,f[i].slice(0,3))<0&&(f[i][3]=1,n.from&&(f._rgba=n.from(f[i])))}),this},is:function(e){var t=o(e),n=!0,r=this;return h(u,function(e,i){var s,o=t[i.cache];return o&&(s=r[i.cache]||i.to&&i.to(r._rgba)||[],h(i.props,function(e,t){if(o[t.idx]!=null)return n=o[t.idx]===s[t.idx],n})),n}),n},_space:function(){var e=[],t=this;return h(u,function(n,r){t[r.cache]&&e.push(n)}),e.pop()},transition:function(e,t){var n=o(e),r=n._space(),i=u[r],s=this.alpha()===0?o("transparent"):this,f=s[i.cache]||i.to(s._rgba),l=f.slice();return n=n[i.cache],h(i.props,function(e,r){var i=r.idx,s=f[i],o=n[i],u=a[r.type]||{};if(o===null)return;s===null?l[i]=o:(u.mod&&(o-s>u.mod/2?s+=u.mod:s-o>u.mod/2&&(s-=u.mod)),l[i]=p((o-s)*t+s,r))}),this[r](l)},blend:function(e){if(this._rgba[3]===1)return this;var n=this._rgba.slice(),r=n.pop(),i=o(e)._rgba;return o(t.map(n,function(e,t){return(1-r)*i[t]+r*e}))},toRgbaString:function(){var e="rgba(",n=t.map(this._rgba,function(e,t){return e==null?t>2?1:0:e});return n[3]===1&&(n.pop(),e="rgb("),e+n.join()+")"},toHslaString:function(){var e="hsla(",n=t.map(this.hsla(),function(e,t){return e==null&&(e=t>2?1:0),t&&t<3&&(e=Math.round(e*100)+"%"),e});return n[3]===1&&(n.pop(),e="hsl("),e+n.join()+")"},toHexString:function(e){var n=this._rgba.slice(),r=n.pop();return e&&n.push(~~(r*255)),"#"+t.map(n,function(e){return e=(e||0).toString(16),e.length===1?"0"+e:e}).join("")},toString:function(){return this._rgba[3]===0?"transparent":this.toRgbaString()}}),o.fn.parse.prototype=o.fn,u.hsla.to=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/255,n=e[1]/255,r=e[2]/255,i=e[3],s=Math.max(t,n,r),o=Math.min(t,n,r),u=s-o,a=s+o,f=a*.5,l,c;return o===s?l=0:t===s?l=60*(n-r)/u+360:n===s?l=60*(r-t)/u+120:l=60*(t-n)/u+240,f===0||f===1?c=f:f<=.5?c=u/a:c=u/(2-a),[Math.round(l)%360,c,f,i==null?1:i]},u.hsla.from=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/360,n=e[1],r=e[2],i=e[3],s=r<=.5?r*(1+n):r+n-r*n,o=2*r-s;return[Math.round(v(o,s,t+1/3)*255),Math.round(v(o,s,t)*255),Math.round(v(o,s,t-1/3)*255),i]},h(u,function(e,r){var s=r.props,u=r.cache,a=r.to,f=r.from;o.fn[e]=function(e){a&&!this[u]&&(this[u]=a(this._rgba));if(e===n)return this[u].slice();var r,i=t.type(e),l=i==="array"||i==="object"?e:arguments,c=this[u].slice();return h(s,function(e,t){var n=l[i==="object"?e:t.idx];n==null&&(n=c[t.idx]),c[t.idx]=p(n,t)}),f?(r=o(f(c)),r[u]=c,r):o(c)},h(s,function(n,r){if(o.fn[n])return;o.fn[n]=function(s){var o=t.type(s),u=n==="alpha"?this._hsla?"hsla":"rgba":e,a=this[u](),f=a[r.idx],l;return o==="undefined"?f:(o==="function"&&(s=s.call(this,f),o=t.type(s)),s==null&&r.empty?this:(o==="string"&&(l=i.exec(s),l&&(s=f+parseFloat(l[2])*(l[1]==="+"?1:-1))),a[r.idx]=s,this[u](a)))}})}),h(r,function(e,n){t.cssHooks[n]={set:function(e,r){var i,s,u="";if(t.type(r)!=="string"||(i=d(r))){r=o(i||r);if(!f.rgba&&r._rgba[3]!==1){s=n==="backgroundColor"?e.parentNode:e;while((u===""||u==="transparent")&&s&&s.style)try{u=t.css(s,"backgroundColor"),s=s.parentNode}catch(a){}r=r.blend(u&&u!=="transparent"?u:"_default")}r=r.toRgbaString()}try{e.style[n]=r}catch(l){}}},t.fx.step[n]=function(e){e.colorInit||(e.start=o(e.elem,n),e.end=o(e.end),e.colorInit=!0),t.cssHooks[n].set(e.elem,e.start.transition(e.end,e.pos))}}),t.cssHooks.borderColor={expand:function(e){var t={};return h(["Top","Right","Bottom","Left"],function(n,r){t["border"+r+"Color"]=e}),t}},c=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(){var t=this.ownerDocument.defaultView?this.ownerDocument.defaultView.getComputedStyle(this,null):this.currentStyle,n={},r,i;if(t&&t.length&&t[0]&&t[t[0]]){i=t.length;while(i--)r=t[i],typeof t[r]=="string"&&(n[e.camelCase(r)]=t[r])}else for(r in t)typeof t[r]=="string"&&(n[r]=t[r]);return n}function s(t,n){var i={},s,o;for(s in n)o=n[s],t[s]!==o&&!r[s]&&(e.fx.step[s]||!isNaN(parseFloat(o)))&&(i[s]=o);return i}var n=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,n){e.fx.step[n]=function(e){if(e.end!=="none"&&!e.setAttr||e.pos===1&&!e.setAttr)jQuery.style(e.elem,n,e.end),e.setAttr=!0}}),e.effects.animateClass=function(t,r,o,u){var a=e.speed(r,o,u);return this.queue(function(){var r=e(this),o=r.attr("class")||"",u,f=a.children?r.find("*").andSelf():r;f=f.map(function(){var t=e(this);return{el:t,start:i.call(this)}}),u=function(){e.each(n,function(e,n){t[n]&&r[n+"Class"](t[n])})},u(),f=f.map(function(){return this.end=i.call(this.el[0]),this.diff=s(this.start,this.end),this}),r.attr("class",o),f=f.map(function(){var t=this,n=e.Deferred(),r=jQuery.extend({},a,{queue:!1,complete:function(){n.resolve(t)}});return this.el.animate(this.diff,r),n.promise()}),e.when.apply(e,f.get()).done(function(){u(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),a.complete.call(r[0])})})},e.fn.extend({_addClass:e.fn.addClass,addClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{add:t},n,r,i):this._addClass(t)},_removeClass:e.fn.removeClass,removeClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{remove:t},n,r,i):this._removeClass(t)},_toggleClass:e.fn.toggleClass,toggleClass:function(n,r,i,s,o){return typeof r=="boolean"||r===t?i?e.effects.animateClass.call(this,r?{add:n}:{remove:n},i,s,o):this._toggleClass(n,r):e.effects.animateClass.call(this,{toggle:n},r,i,s)},switchClass:function(t,n,r,i,s){return e.effects.animateClass.call(this,{add:n,remove:t},r,i,s)}})}(),function(){function i(t,n,r,i){e.isPlainObject(t)&&(n=t,t=t.effect),t={effect:t},n==null&&(n={}),e.isFunction(n)&&(i=n,r=null,n={});if(typeof n=="number"||e.fx.speeds[n])i=r,r=n,n={};return e.isFunction(r)&&(i=r,r=null),n&&e.extend(t,n),r=r||n.duration,t.duration=e.fx.off?0:typeof r=="number"?r:r in e.fx.speeds?e.fx.speeds[r]:e.fx.speeds._default,t.complete=i||n.complete,t}function s(t){return!t||typeof t=="number"||e.fx.speeds[t]?!0:typeof t=="string"&&!e.effects.effect[t]?n&&e.effects[t]?!1:!0:!1}e.extend(e.effects,{version:"1.9.1",save:function(e,t){for(var n=0;n
").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),i={width:t.width(),height:t.height()},s=document.activeElement;try{s.id}catch(o){s=document.body}return t.wrap(r),(t[0]===s||e.contains(t[0],s))&&e(s).focus(),r=t.parent(),t.css("position")==="static"?(r.css({position:"relative"}),t.css({position:"relative"})):(e.extend(n,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,r){n[r]=t.css(r),isNaN(parseInt(n[r],10))&&(n[r]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(i),r.css(n).show()},removeWrapper:function(t){var n=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===n||e.contains(t[0],n))&&e(n).focus()),t},setTransition:function(t,n,r,i){return i=i||{},e.each(n,function(e,n){var s=t.cssUnit(n);s[0]>0&&(i[n]=s[0]*r+s[1])}),i}}),e.fn.extend({effect:function(){function a(n){function u(){e.isFunction(i)&&i.call(r[0]),e.isFunction(n)&&n()}var r=e(this),i=t.complete,s=t.mode;(r.is(":hidden")?s==="hide":s==="show")?u():o.call(r[0],t,u)}var t=i.apply(this,arguments),r=t.mode,s=t.queue,o=e.effects.effect[t.effect],u=!o&&n&&e.effects[t.effect];return e.fx.off||!o&&!u?r?this[r](t.duration,t.complete):this.each(function(){t.complete&&t.complete.call(this)}):o?s===!1?this.each(a):this.queue(s||"fx",a):u.call(this,{options:t,duration:t.duration,callback:t.complete,mode:t.mode})},_show:e.fn.show,show:function(e){if(s(e))return this._show.apply(this,arguments);var t=i.apply(this,arguments);return t.mode="show",this.effect.call(this,t)},_hide:e.fn.hide,hide:function(e){if(s(e))return this._hide.apply(this,arguments);var t=i.apply(this,arguments);return t.mode="hide",this.effect.call(this,t)},__toggle:e.fn.toggle,toggle:function(t){if(s(t)||typeof t=="boolean"||e.isFunction(t))return this.__toggle.apply(this,arguments);var n=i.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)},cssUnit:function(t){var n=this.css(t),r=[];return e.each(["em","px","%","pt"],function(e,t){n.indexOf(t)>0&&(r=[parseFloat(n),t])}),r}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,n){t[n]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return e===0||e===1?e:-Math.pow(2,8*(e-1))*Math.sin(((e-1)*80-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){var t,n=4;while(e<((t=Math.pow(2,--n))-1)/11);return 1/Math.pow(4,3-n)-7.5625*Math.pow((t*3-2)/22-e,2)}}),e.each(t,function(t,n){e.easing["easeIn"+t]=n,e.easing["easeOut"+t]=function(e){return 1-n(1-e)},e.easing["easeInOut"+t]=function(e){return e<.5?n(e*2)/2:1-n(e*-2+2)/2}})}()}(jQuery);(function(e,t){var n=/up|down|vertical/,r=/up|left|vertical|horizontal/;e.effects.effect.blind=function(t,i){var s=e(this),o=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(s,t.mode||"hide"),a=t.direction||"up",f=n.test(a),l=f?"height":"width",c=f?"top":"left",h=r.test(a),p={},d=u==="show",v,m,g;s.parent().is(".ui-effects-wrapper")?e.effects.save(s.parent(),o):e.effects.save(s,o),s.show(),v=e.effects.createWrapper(s).css({overflow:"hidden"}),m=v[l](),g=parseFloat(v.css(c))||0,p[l]=d?m:0,h||(s.css(f?"bottom":"right",0).css(f?"top":"left","auto").css({position:"absolute"}),p[c]=d?g:m+g),d&&(v.css(l,0),h||v.css(c,g+m)),v.animate(p,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){u==="hide"&&s.hide(),e.effects.restore(s,o),e.effects.removeWrapper(s),i()}})}})(jQuery);(function(e,t){e.effects.effect.bounce=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=s==="hide",u=s==="show",a=t.direction||"up",f=t.distance,l=t.times||5,c=l*2+(u||o?1:0),h=t.duration/c,p=t.easing,d=a==="up"||a==="down"?"top":"left",v=a==="up"||a==="left",m,g,y,b=r.queue(),w=b.length;(u||o)&&i.push("opacity"),e.effects.save(r,i),r.show(),e.effects.createWrapper(r),f||(f=r[d==="top"?"outerHeight":"outerWidth"]()/3),u&&(y={opacity:1},y[d]=0,r.css("opacity",0).css(d,v?-f*2:f*2).animate(y,h,p)),o&&(f/=Math.pow(2,l-1)),y={},y[d]=0;for(m=0;m1&&b.splice.apply(b,[1,0].concat(b.splice(w,c+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.clip=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"vertical",a=u==="vertical",f=a?"height":"width",l=a?"top":"left",c={},h,p,d;e.effects.save(r,i),r.show(),h=e.effects.createWrapper(r).css({overflow:"hidden"}),p=r[0].tagName==="IMG"?h:r,d=p[f](),o&&(p.css(f,0),p.css(l,d/2)),c[f]=o?d:0,c[l]=o?0:d/2,p.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){o||r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.drop=function(t,n){var r=e(this),i=["position","top","bottom","left","right","opacity","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left"?"pos":"neg",l={opacity:o?1:0},c;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),c=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0)/2,o&&r.css("opacity",0).css(a,f==="pos"?-c:c),l[a]=(o?f==="pos"?"+=":"-=":f==="pos"?"-=":"+=")+c,r.animate(l,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.explode=function(t,n){function y(){c.push(this),c.length===r*i&&b()}function b(){s.css({visibility:"visible"}),e(c).remove(),u||s.hide(),n()}var r=t.pieces?Math.round(Math.sqrt(t.pieces)):3,i=r,s=e(this),o=e.effects.setMode(s,t.mode||"hide"),u=o==="show",a=s.show().css("visibility","hidden").offset(),f=Math.ceil(s.outerWidth()/i),l=Math.ceil(s.outerHeight()/r),c=[],h,p,d,v,m,g;for(h=0;h
").css({position:"absolute",visibility:"visible",left:-p*f,top:-h*l}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:f,height:l,left:d+(u?m*f:0),top:v+(u?g*l:0),opacity:u?0:1}).animate({left:d+(u?0:m*f),top:v+(u?0:g*l),opacity:u?1:0},t.duration||500,t.easing,y)}}})(jQuery);(function(e,t){e.effects.effect.fade=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"toggle");r.animate({opacity:i},{queue:!1,duration:t.duration,easing:t.easing,complete:n})}})(jQuery);(function(e,t){e.effects.effect.fold=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=s==="hide",a=t.size||15,f=/([0-9]+)%/.exec(a),l=!!t.horizFirst,c=o!==l,h=c?["width","height"]:["height","width"],p=t.duration/2,d,v,m={},g={};e.effects.save(r,i),r.show(),d=e.effects.createWrapper(r).css({overflow:"hidden"}),v=c?[d.width(),d.height()]:[d.height(),d.width()],f&&(a=parseInt(f[1],10)/100*v[u?0:1]),o&&d.css(l?{height:0,width:a}:{height:a,width:0}),m[h[0]]=o?v[0]:a,g[h[1]]=o?v[1]:0,d.animate(m,p,t.easing).animate(g,p,t.easing,function(){u&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()})}})(jQuery);(function(e,t){e.effects.effect.highlight=function(t,n){var r=e(this),i=["backgroundImage","backgroundColor","opacity"],s=e.effects.setMode(r,t.mode||"show"),o={backgroundColor:r.css("backgroundColor")};s==="hide"&&(o.opacity=0),e.effects.save(r,i),r.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),n()}})}})(jQuery);(function(e,t){e.effects.effect.pulsate=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"show"),s=i==="show",o=i==="hide",u=s||i==="hide",a=(t.times||5)*2+(u?1:0),f=t.duration/a,l=0,c=r.queue(),h=c.length,p;if(s||!r.is(":visible"))r.css("opacity",0).show(),l=1;for(p=1;p1&&c.splice.apply(c,[1,0].concat(c.splice(h,a+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.puff=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"hide"),s=i==="hide",o=parseInt(t.percent,10)||150,u=o/100,a={height:r.height(),width:r.width()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:i,complete:n,percent:s?o:100,from:s?a:{height:a.height*u,width:a.width*u}}),r.effect(t)},e.effects.effect.scale=function(t,n){var r=e(this),i=e.extend(!0,{},t),s=e.effects.setMode(r,t.mode||"effect"),o=parseInt(t.percent,10)||(parseInt(t.percent,10)===0?0:s==="hide"?0:100),u=t.direction||"both",a=t.origin,f={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()},l={y:u!=="horizontal"?o/100:1,x:u!=="vertical"?o/100:1};i.effect="size",i.queue=!1,i.complete=n,s!=="effect"&&(i.origin=a||["middle","center"],i.restore=!0),i.from=t.from||(s==="show"?{height:0,width:0}:f),i.to={height:f.height*l.y,width:f.width*l.x,outerHeight:f.outerHeight*l.y,outerWidth:f.outerWidth*l.x},i.fade&&(s==="show"&&(i.from.opacity=0,i.to.opacity=1),s==="hide"&&(i.from.opacity=1,i.to.opacity=0)),r.effect(i)},e.effects.effect.size=function(t,n){var r,i,s,o=e(this),u=["position","top","bottom","left","right","width","height","overflow","opacity"],a=["position","top","bottom","left","right","overflow","opacity"],f=["width","height","overflow"],l=["fontSize"],c=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],h=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),d=t.restore||p!=="effect",v=t.scale||"both",m=t.origin||["middle","center"],g=o.css("position"),y=d?u:a,b={height:0,width:0};p==="show"&&o.show(),r={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},t.mode==="toggle"&&p==="show"?(o.from=t.to||b,o.to=t.from||r):(o.from=t.from||(p==="show"?b:r),o.to=t.to||(p==="hide"?b:r)),s={from:{y:o.from.height/r.height,x:o.from.width/r.width},to:{y:o.to.height/r.height,x:o.to.width/r.width}};if(v==="box"||v==="both")s.from.y!==s.to.y&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,s.from.y,o.from),o.to=e.effects.setTransition(o,c,s.to.y,o.to)),s.from.x!==s.to.x&&(y=y.concat(h),o.from=e.effects.setTransition(o,h,s.from.x,o.from),o.to=e.effects.setTransition(o,h,s.to.x,o.to));(v==="content"||v==="both")&&s.from.y!==s.to.y&&(y=y.concat(l).concat(f),o.from=e.effects.setTransition(o,l,s.from.y,o.from),o.to=e.effects.setTransition(o,l,s.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),m&&(i=e.effects.getBaseline(m,r),o.from.top=(r.outerHeight-o.outerHeight())*i.y,o.from.left=(r.outerWidth-o.outerWidth())*i.x,o.to.top=(r.outerHeight-o.to.outerHeight)*i.y,o.to.left=(r.outerWidth-o.to.outerWidth)*i.x),o.css(o.from);if(v==="content"||v==="both")c=c.concat(["marginTop","marginBottom"]).concat(l),h=h.concat(["marginLeft","marginRight"]),f=u.concat(c).concat(h),o.find("*[width]").each(function(){var n=e(this),r={height:n.height(),width:n.width()};d&&e.effects.save(n,f),n.from={height:r.height*s.from.y,width:r.width*s.from.x},n.to={height:r.height*s.to.y,width:r.width*s.to.x},s.from.y!==s.to.y&&(n.from=e.effects.setTransition(n,c,s.from.y,n.from),n.to=e.effects.setTransition(n,c,s.to.y,n.to)),s.from.x!==s.to.x&&(n.from=e.effects.setTransition(n,h,s.from.x,n.from),n.to=e.effects.setTransition(n,h,s.to.x,n.to)),n.css(n.from),n.animate(n.to,t.duration,t.easing,function(){d&&e.effects.restore(n,f)})});o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){o.to.opacity===0&&o.css("opacity",o.from.opacity),p==="hide"&&o.hide(),e.effects.restore(o,y),d||(g==="static"?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,n){var r=parseInt(n,10),i=e?o.to.left:o.to.top;return n==="auto"?i+"px":r+i+"px"})})),e.effects.removeWrapper(o),n()}})}})(jQuery);(function(e,t){e.effects.effect.shake=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=t.direction||"left",u=t.distance||20,a=t.times||3,f=a*2+1,l=Math.round(t.duration/f),c=o==="up"||o==="down"?"top":"left",h=o==="up"||o==="left",p={},d={},v={},m,g=r.queue(),y=g.length;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),p[c]=(h?"-=":"+=")+u,d[c]=(h?"+=":"-=")+u*2,v[c]=(h?"-=":"+=")+u*2,r.animate(p,l,t.easing);for(m=1;m1&&g.splice.apply(g,[1,0].concat(g.splice(y,f+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.slide=function(t,n){var r=e(this),i=["position","top","bottom","left","right","width","height"],s=e.effects.setMode(r,t.mode||"show"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left",l,c={};e.effects.save(r,i),r.show(),l=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(r).css({overflow:"hidden"}),o&&r.css(a,f?isNaN(l)?"-"+l:-l:l),c[a]=(o?f?"+=":"-=":f?"-=":"+=")+l,r.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.transfer=function(t,n){var r=e(this),i=e(t.to),s=i.css("position")==="fixed",o=e("body"),u=s?o.scrollTop():0,a=s?o.scrollLeft():0,f=i.offset(),l={top:f.top-u,left:f.left-a,height:i.innerHeight(),width:i.innerWidth()},c=r.offset(),h=e('
').appendTo(document.body).addClass(t.className).css({top:c.top-u,left:c.left-a,height:r.innerHeight(),width:r.innerWidth(),position:s?"fixed":"absolute"}).animate(l,t.duration,t.easing,function(){h.remove(),n()})}})(jQuery);(function(e,t){var n=!1;e.widget("ui.menu",{version:"1.9.1",defaultElement:"
    ",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,e.proxy(function(e){this.options.disabled&&e.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(e){e.preventDefault()},"click .ui-state-disabled > a":function(e){e.preventDefault()},"click .ui-menu-item:has(a)":function(t){var r=e(t.target).closest(".ui-menu-item");!n&&r.not(".ui-state-disabled").length&&(n=!0,this.select(t),r.has(".ui-menu").length?this.expand(t):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&this.active.parents(".ui-menu").length===1&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var n=e(t.currentTarget);n.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(t,n)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var n=this.active||this.element.children(".ui-menu-item").eq(0);t||this.focus(e,n)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){e(t.target).closest(".ui-menu").length||this.collapseAll(t),n=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").andSelf().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function a(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var n,r,i,s,o,u=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:u=!1,r=this.previousFilter||"",i=String.fromCharCode(t.keyCode),s=!1,clearTimeout(this.filterTimer),i===r?s=!0:i=r+i,o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())}),n=s&&n.index(this.active.next())!==-1?this.active.nextAll(".ui-menu-item"):n,n.length||(i=String.fromCharCode(t.keyCode),o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())})),n.length?(this.focus(t,n),n.length>1?(this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}u&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(e):this.select(e))},refresh:function(){var t,n=this.options.icons.submenu,r=this.element.find(this.options.menus+":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"});t=r.add(this.element),t.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),t.children(":not(.ui-menu-item)").each(function(){var t=e(this);/[^\-—–\s]/.test(t.text())||t.addClass("ui-widget-content ui-menu-divider")}),t.children(".ui-state-disabled").attr("aria-disabled","true"),r.each(function(){var t=e(this),r=t.prev("a"),i=e("").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);r.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",r.attr("id"))}),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},focus:function(e,t){var n,r;this.blur(e,e&&e.type==="focus"),this._scrollIntoView(t),this.active=t.first(),r=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",r.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),e&&e.type==="keydown"?this._close():this.timer=this._delay(function(){this._close()},this.delay),n=t.children(".ui-menu"),n.length&&/^mouse/.test(e.type)&&this._startOpening(n),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var n,r,i,s,o,u;this._hasScroll()&&(n=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,r=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,i=t.offset().top-this.activeMenu.offset().top-n-r,s=this.activeMenu.scrollTop(),o=this.activeMenu.height(),u=t.height(),i<0?this.activeMenu.scrollTop(s+i):i+u>o&&this.activeMenu.scrollTop(s+i-o+u))},blur:function(e,t){t||clearTimeout(this.timer);if(!this.active)return;this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active})},_startOpening:function(e){clearTimeout(this.timer);if(e.attr("aria-hidden")!=="true")return;this.timer=this._delay(function(){this._close(),this._open(e)},this.delay)},_open:function(t){var n=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(n)},collapseAll:function(t,n){clearTimeout(this.timer),this.timer=this._delay(function(){var r=n?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));r.length||(r=this.element),this._close(r),this.blur(t),this.activeMenu=r},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,n){var r;this.active&&(e==="first"||e==="last"?r=this.active[e==="first"?"prevAll":"nextAll"](".ui-menu-item").eq(-1):r=this.active[e+"All"](".ui-menu-item").eq(0));if(!r||!r.length||!this.active)r=this.activeMenu.children(".ui-menu-item")[t]();this.focus(n,r)},nextPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isLastItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r-i<0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())},previousPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isFirstItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r+i>0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item").first())},_hasScroll:function(){return this.element.outerHeight()
").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return e===t?this._value():(this._setOption("value",e),this)},_setOption:function(e,t){e==="value"&&(this.options.value=t,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),this._super(e,t)},_value:function(){var e=this.options.value;return typeof e!="number"&&(e=0),Math.min(this.options.max,Math.max(this.min,e))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var e=this.value(),t=this._percentage();this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),this.valueDiv.toggle(e>this.min).toggleClass("ui-corner-right",e===this.options.max).width(t.toFixed(0)+"%"),this.element.attr("aria-valuenow",e)}})})(jQuery);(function(e,t){e.widget("ui.resizable",e.ui.mouse,{version:"1.9.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var t=this,n=this.options;this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!n.aspectRatio,aspectRatio:n.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:n.helper||n.ghost||n.animate?n.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=n.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var r=this.handles.split(",");this.handles={};for(var i=0;i');u.css({zIndex:n.zIndex}),"se"==s&&u.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(u)}}this._renderAxis=function(t){t=t||this.element;for(var n in this.handles){this.handles[n].constructor==String&&(this.handles[n]=e(this.handles[n],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var r=e(this.handles[n],this.element),i=0;i=/sw|ne|nw|se|n|s/.test(n)?r.outerHeight():r.outerWidth();var s=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");t.css(s,i),this._proportionallyResize()}if(!e(this.handles[n]).length)continue}},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!t.resizing){if(this.className)var e=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);t.axis=e&&e[1]?e[1]:"se"}}),n.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){if(n.disabled)return;e(this).removeClass("ui-resizable-autohide"),t._handles.show()}).mouseleave(function(){if(n.disabled)return;t.resizing||(e(this).addClass("ui-resizable-autohide"),t._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){t(this.element);var n=this.element;this.originalElement.css({position:n.css("position"),width:n.outerWidth(),height:n.outerHeight(),top:n.css("top"),left:n.css("left")}).insertAfter(n),n.remove()}return this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_mouseCapture:function(t){var n=!1;for(var r in this.handles)e(this.handles[r])[0]==t.target&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var r=this.options,i=this.element.position(),s=this.element;this.resizing=!0,this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()},(s.is(".ui-draggable")||/absolute/.test(s.css("position")))&&s.css({position:"absolute",top:i.top,left:i.left}),this._renderProxy();var o=n(this.helper.css("left")),u=n(this.helper.css("top"));r.containment&&(o+=e(r.containment).scrollLeft()||0,u+=e(r.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:o,top:u},this.size=this._helper?{width:s.outerWidth(),height:s.outerHeight()}:{width:s.width(),height:s.height()},this.originalSize=this._helper?{width:s.outerWidth(),height:s.outerHeight()}:{width:s.width(),height:s.height()},this.originalPosition={left:o,top:u},this.sizeDiff={width:s.outerWidth()-s.width(),height:s.outerHeight()-s.height()},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio=typeof r.aspectRatio=="number"?r.aspectRatio:this.originalSize.width/this.originalSize.height||1;var a=e(".ui-resizable-"+this.axis).css("cursor");return e("body").css("cursor",a=="auto"?this.axis+"-resize":a),s.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(e){var t=this.helper,n=this.options,r={},i=this,s=this.originalMousePosition,o=this.axis,u=e.pageX-s.left||0,a=e.pageY-s.top||0,f=this._change[o];if(!f)return!1;var l=f.apply(this,[e,u,a]);this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey)l=this._updateRatio(l,e);return l=this._respectSize(l,e),this._propagate("resize",e),t.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",e,this.ui()),!1},_mouseStop:function(t){this.resizing=!1;var n=this.options,r=this;if(this._helper){var i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),o=s&&e.ui.hasScroll(i[0],"left")?0:r.sizeDiff.height,u=s?0:r.sizeDiff.width,a={width:r.helper.width()-u,height:r.helper.height()-o},f=parseInt(r.element.css("left"),10)+(r.position.left-r.originalPosition.left)||null,l=parseInt(r.element.css("top"),10)+(r.position.top-r.originalPosition.top)||null;n.animate||this.element.css(e.extend(a,{top:l,left:f})),r.helper.height(r.size.height),r.helper.width(r.size.width),this._helper&&!n.animate&&this._proportionallyResize()}return e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t=this.options,n,i,s,o,u;u={minWidth:r(t.minWidth)?t.minWidth:0,maxWidth:r(t.maxWidth)?t.maxWidth:Infinity,minHeight:r(t.minHeight)?t.minHeight:0,maxHeight:r(t.maxHeight)?t.maxHeight:Infinity};if(this._aspectRatio||e)n=u.minHeight*this.aspectRatio,s=u.minWidth/this.aspectRatio,i=u.maxHeight*this.aspectRatio,o=u.maxWidth/this.aspectRatio,n>u.minWidth&&(u.minWidth=n),s>u.minHeight&&(u.minHeight=s),ie.width,l=r(e.height)&&i.minHeight&&i.minHeight>e.height;f&&(e.width=i.minWidth),l&&(e.height=i.minHeight),u&&(e.width=i.maxWidth),a&&(e.height=i.maxHeight);var c=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,p=/sw|nw|w/.test(o),d=/nw|ne|n/.test(o);f&&p&&(e.left=c-i.minWidth),u&&p&&(e.left=c-i.maxWidth),l&&d&&(e.top=h-i.minHeight),a&&d&&(e.top=h-i.maxHeight);var v=!e.width&&!e.height;return v&&!e.left&&e.top?e.top=null:v&&!e.top&&e.left&&(e.left=null),e},_proportionallyResize:function(){var t=this.options;if(!this._proportionallyResizeElements.length)return;var n=this.helper||this.element;for(var r=0;r');var r=e.ui.ie6?1:0,i=e.ui.ie6?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+i,height:this.element.outerHeight()+i,position:"absolute",left:this.elementOffset.left-r+"px",top:this.elementOffset.top-r+"px",zIndex:++n.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(e,t,n){return{width:this.originalSize.width+t}},w:function(e,t,n){var r=this.options,i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,n){var r=this.options,i=this.originalSize,s=this.originalPosition;return{top:s.top+n,height:i.height-n}},s:function(e,t,n){return{height:this.originalSize.height+n}},se:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},sw:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,n,r]))},ne:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},nw:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,n,r]))}},_propagate:function(t,n){e.ui.plugin.call(this,t,[n,this.ui()]),t!="resize"&&this._trigger(t,n,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","alsoResize",{start:function(t,n){var r=e(this).data("resizable"),i=r.options,s=function(t){e(t).each(function(){var t=e(this);t.data("resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};typeof i.alsoResize=="object"&&!i.alsoResize.parentNode?i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)}):s(i.alsoResize)},resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.originalSize,o=r.originalPosition,u={height:r.size.height-s.height||0,width:r.size.width-s.width||0,top:r.position.top-o.top||0,left:r.position.left-o.left||0},a=function(t,r){e(t).each(function(){var t=e(this),i=e(this).data("resizable-alsoresize"),s={},o=r&&r.length?r:t.parents(n.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var n=(i[t]||0)+(u[t]||0);n&&n>=0&&(s[t]=n||null)}),t.css(s)})};typeof i.alsoResize=="object"&&!i.alsoResize.nodeType?e.each(i.alsoResize,function(e,t){a(e,t)}):a(i.alsoResize)},stop:function(t,n){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","animate",{stop:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r._proportionallyResizeElements,o=s.length&&/textarea/i.test(s[0].nodeName),u=o&&e.ui.hasScroll(s[0],"left")?0:r.sizeDiff.height,a=o?0:r.sizeDiff.width,f={width:r.size.width-a,height:r.size.height-u},l=parseInt(r.element.css("left"),10)+(r.position.left-r.originalPosition.left)||null,c=parseInt(r.element.css("top"),10)+(r.position.top-r.originalPosition.top)||null;r.element.animate(e.extend(f,c&&l?{top:c,left:l}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var n={width:parseInt(r.element.css("width"),10),height:parseInt(r.element.css("height"),10),top:parseInt(r.element.css("top"),10),left:parseInt(r.element.css("left"),10)};s&&s.length&&e(s[0]).css({width:n.width,height:n.height}),r._updateCache(n),r._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(t,r){var i=e(this).data("resizable"),s=i.options,o=i.element,u=s.containment,a=u instanceof e?u.get(0):/parent/.test(u)?o.parent().get(0):u;if(!a)return;i.containerElement=e(a);if(/document/.test(u)||u==document)i.containerOffset={left:0,top:0},i.containerPosition={left:0,top:0},i.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight};else{var f=e(a),l=[];e(["Top","Right","Left","Bottom"]).each(function(e,t){l[e]=n(f.css("padding"+t))}),i.containerOffset=f.offset(),i.containerPosition=f.position(),i.containerSize={height:f.innerHeight()-l[3],width:f.innerWidth()-l[1]};var c=i.containerOffset,h=i.containerSize.height,p=i.containerSize.width,d=e.ui.hasScroll(a,"left")?a.scrollWidth:p,v=e.ui.hasScroll(a)?a.scrollHeight:h;i.parentData={element:a,left:c.left,top:c.top,width:d,height:v}}},resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.containerSize,o=r.containerOffset,u=r.size,a=r.position,f=r._aspectRatio||t.shiftKey,l={top:0,left:0},c=r.containerElement;c[0]!=document&&/static/.test(c.css("position"))&&(l=o),a.left<(r._helper?o.left:0)&&(r.size.width=r.size.width+(r._helper?r.position.left-o.left:r.position.left-l.left),f&&(r.size.height=r.size.width/r.aspectRatio),r.position.left=i.helper?o.left:0),a.top<(r._helper?o.top:0)&&(r.size.height=r.size.height+(r._helper?r.position.top-o.top:r.position.top),f&&(r.size.width=r.size.height*r.aspectRatio),r.position.top=r._helper?o.top:0),r.offset.left=r.parentData.left+r.position.left,r.offset.top=r.parentData.top+r.position.top;var h=Math.abs((r._helper?r.offset.left-l.left:r.offset.left-l.left)+r.sizeDiff.width),p=Math.abs((r._helper?r.offset.top-l.top:r.offset.top-o.top)+r.sizeDiff.height),d=r.containerElement.get(0)==r.element.parent().get(0),v=/relative|absolute/.test(r.containerElement.css("position"));d&&v&&(h-=r.parentData.left),h+r.size.width>=r.parentData.width&&(r.size.width=r.parentData.width-h,f&&(r.size.height=r.size.width/r.aspectRatio)),p+r.size.height>=r.parentData.height&&(r.size.height=r.parentData.height-p,f&&(r.size.width=r.size.height*r.aspectRatio))},stop:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.position,o=r.containerOffset,u=r.containerPosition,a=r.containerElement,f=e(r.helper),l=f.offset(),c=f.outerWidth()-r.sizeDiff.width,h=f.outerHeight()-r.sizeDiff.height;r._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:l.left-u.left-o.left,width:c,height:h}),r._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:l.left-u.left-o.left,width:c,height:h})}}),e.ui.plugin.add("resizable","ghost",{start:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.size;r.ghost=r.originalElement.clone(),r.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:""),r.ghost.appendTo(r.helper)},resize:function(t,n){var r=e(this).data("resizable"),i=r.options;r.ghost&&r.ghost.css({position:"relative",height:r.size.height,width:r.size.width})},stop:function(t,n){var r=e(this).data("resizable"),i=r.options;r.ghost&&r.helper&&r.helper.get(0).removeChild(r.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.size,o=r.originalSize,u=r.originalPosition,a=r.axis,f=i._aspectRatio||t.shiftKey;i.grid=typeof i.grid=="number"?[i.grid,i.grid]:i.grid;var l=Math.round((s.width-o.width)/(i.grid[0]||1))*(i.grid[0]||1),c=Math.round((s.height-o.height)/(i.grid[1]||1))*(i.grid[1]||1);/^(se|s|e)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c):/^(ne)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c,r.position.top=u.top-c):/^(sw)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c,r.position.left=u.left-l):(r.size.width=o.width+l,r.size.height=o.height+c,r.position.top=u.top-c,r.position.left=u.left-l)}});var n=function(e){return parseInt(e,10)||0},r=function(e){return!isNaN(parseInt(e,10))}})(jQuery);(function(e,t){e.widget("ui.selectable",e.ui.mouse,{version:"1.9.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var t=this;this.element.addClass("ui-selectable"),this.dragged=!1;var n;this.refresh=function(){n=e(t.options.filter,t.element[0]),n.addClass("ui-selectee"),n.each(function(){var t=e(this),n=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:n.left,top:n.top,right:n.left+t.outerWidth(),bottom:n.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=n.addClass("ui-selectee"),this._mouseInit(),this.helper=e("
")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var n=this;this.opos=[t.pageX,t.pageY];if(this.options.disabled)return;var r=this.options;this.selectees=e(r.filter,this.element[0]),this._trigger("start",t),e(r.appendTo).append(this.helper),this.helper.css({left:t.clientX,top:t.clientY,width:0,height:0}),r.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var r=e.data(this,"selectable-item");r.startselected=!0,!t.metaKey&&!t.ctrlKey&&(r.$element.removeClass("ui-selected"),r.selected=!1,r.$element.addClass("ui-unselecting"),r.unselecting=!0,n._trigger("unselecting",t,{unselecting:r.element}))}),e(t.target).parents().andSelf().each(function(){var r=e.data(this,"selectable-item");if(r){var i=!t.metaKey&&!t.ctrlKey||!r.$element.hasClass("ui-selected");return r.$element.removeClass(i?"ui-unselecting":"ui-selected").addClass(i?"ui-selecting":"ui-unselecting"),r.unselecting=!i,r.selecting=i,r.selected=i,i?n._trigger("selecting",t,{selecting:r.element}):n._trigger("unselecting",t,{unselecting:r.element}),!1}})},_mouseDrag:function(t){var n=this;this.dragged=!0;if(this.options.disabled)return;var r=this.options,i=this.opos[0],s=this.opos[1],o=t.pageX,u=t.pageY;if(i>o){var a=o;o=i,i=a}if(s>u){var a=u;u=s,s=a}return this.helper.css({left:i,top:s,width:o-i,height:u-s}),this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!a||a.element==n.element[0])return;var f=!1;r.tolerance=="touch"?f=!(a.left>o||a.rightu||a.bottomi&&a.rights&&a.bottom").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(i.range==="min"||i.range==="max"?" ui-slider-range-"+i.range:""))),r=i.values&&i.values.length||1;for(t=s.length;tn&&(i=n,s=e(this),o=t)}),c.range===!0&&this.values(1)===c.min&&(o+=1,s=e(this.handles[o])),u=this._start(t,o),u===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,s.addClass("ui-state-active").focus(),a=s.offset(),f=!e(t.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=f?{left:0,top:0}:{left:t.pageX-a.left-s.width()/2,top:t.pageY-a.top-s.height()/2-(parseInt(s.css("borderTopWidth"),10)||0)-(parseInt(s.css("borderBottomWidth"),10)||0)+(parseInt(s.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,r),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},n=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,n),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,n,r,i,s;return this.orientation==="horizontal"?(t=this.elementSize.width,n=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,n=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),r=n/t,r>1&&(r=1),r<0&&(r=0),this.orientation==="vertical"&&(r=1-r),i=this._valueMax()-this._valueMin(),s=this._valueMin()+r*i,this._trimAlignValue(s)},_start:function(e,t){var n={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("start",e,n)},_slide:function(e,t,n){var r,i,s;this.options.values&&this.options.values.length?(r=this.values(t?0:1),this.options.values.length===2&&this.options.range===!0&&(t===0&&n>r||t===1&&n1){this.options.values[t]=this._trimAlignValue(n),this._refreshValue(),this._change(null,t);return}if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();r=this.options.values,i=arguments[0];for(s=0;s=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,n=(e-this._valueMin())%t,r=e-n;return Math.abs(n)*2>=t&&(r+=n>0?t:-t),parseFloat(r.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,n,r,i,s,o=this.options.range,u=this.options,a=this,f=this._animateOff?!1:u.animate,l={};this.options.values&&this.options.values.length?this.handles.each(function(r){n=(a.values(r)-a._valueMin())/(a._valueMax()-a._valueMin())*100,l[a.orientation==="horizontal"?"left":"bottom"]=n+"%",e(this).stop(1,1)[f?"animate":"css"](l,u.animate),a.options.range===!0&&(a.orientation==="horizontal"?(r===0&&a.range.stop(1,1)[f?"animate":"css"]({left:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({width:n-t+"%"},{queue:!1,duration:u.animate})):(r===0&&a.range.stop(1,1)[f?"animate":"css"]({bottom:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({height:n-t+"%"},{queue:!1,duration:u.animate}))),t=n}):(r=this.value(),i=this._valueMin(),s=this._valueMax(),n=s!==i?(r-i)/(s-i)*100:0,l[this.orientation==="horizontal"?"left":"bottom"]=n+"%",this.handle.stop(1,1)[f?"animate":"css"](l,u.animate),o==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[f?"animate":"css"]({width:n+"%"},u.animate),o==="max"&&this.orientation==="horizontal"&&this.range[f?"animate":"css"]({width:100-n+"%"},{queue:!1,duration:u.animate}),o==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[f?"animate":"css"]({height:n+"%"},u.animate),o==="max"&&this.orientation==="vertical"&&this.range[f?"animate":"css"]({height:100-n+"%"},{queue:!1,duration:u.animate}))}})})(jQuery);(function(e,t){e.widget("ui.sortable",e.ui.mouse,{version:"1.9.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?e.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_setOption:function(t,n){t==="disabled"?(this.options[t]=n,this.widget().toggleClass("ui-sortable-disabled",!!n)):e.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(t,n){var r=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(t);var i=null,s=e(t.target).parents().each(function(){if(e.data(this,r.widgetName+"-item")==r)return i=e(this),!1});e.data(t.target,r.widgetName+"-item")==r&&(i=e(t.target));if(!i)return!1;if(this.options.handle&&!n){var o=!1;e(this.options.handle,i).find("*").andSelf().each(function(){this==t.target&&(o=!0)});if(!o)return!1}return this.currentItem=i,this._removeCurrentsFromItems(),!0},_mouseStart:function(t,n,r){var i=this.options;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),i.containment&&this._setContainment(),i.cursor&&(e("body").css("cursor")&&(this._storedCursor=e("body").css("cursor")),e("body").css("cursor",i.cursor)),i.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",i.opacity)),i.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",i.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!r)for(var s=this.containers.length-1;s>=0;s--)this.containers[s]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var n=this.options,r=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY=0;i--){var s=this.items[i],o=s.item[0],u=this._intersectsWithPointer(s);if(!u)continue;if(s.instance!==this.currentContainer)continue;if(o!=this.currentItem[0]&&this.placeholder[u==1?"next":"prev"]()[0]!=o&&!e.contains(this.placeholder[0],o)&&(this.options.type=="semi-dynamic"?!e.contains(this.element[0],o):!0)){this.direction=u==1?"down":"up";if(this.options.tolerance!="pointer"&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,n){if(!t)return;e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t);if(this.options.revert){var r=this,i=this.placeholder.offset();this.reverting=!0,e(this.helper).animate({left:i.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:i.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){r._clear(t)})}else this._clear(t,n);return!1},cancel:function(){if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},e(n).each(function(){var n=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[-=_](.+)/);n&&r.push((t.key||n[1]+"[]")+"="+(t.key&&t.expression?n[1]:n[2]))}),!r.length&&t.key&&r.push(t.key+"="),r.join("&")},toArray:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},n.each(function(){r.push(e(t.item||this).attr(t.attribute||"id")||"")}),r},_intersectsWith:function(e){var t=this.positionAbs.left,n=t+this.helperProportions.width,r=this.positionAbs.top,i=r+this.helperProportions.height,s=e.left,o=s+e.width,u=e.top,a=u+e.height,f=this.offset.click.top,l=this.offset.click.left,c=r+f>u&&r+fs&&t+le[this.floating?"width":"height"]?c:s0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return e!=0&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor==String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){var n=[],r=[],i=this._connectWith();if(i&&t)for(var s=i.length-1;s>=0;s--){var o=e(i[s]);for(var u=o.length-1;u>=0;u--){var a=e.data(o[u],this.widgetName);a&&a!=this&&!a.options.disabled&&r.push([e.isFunction(a.options.items)?a.options.items.call(a.element):e(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a])}}r.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var s=r.length-1;s>=0;s--)r[s][0].each(function(){n.push(this)});return e(n)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var n=0;n=0;s--){var o=e(i[s]);for(var u=o.length-1;u>=0;u--){var a=e.data(o[u],this.widgetName);a&&a!=this&&!a.options.disabled&&(r.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a))}}for(var s=r.length-1;s>=0;s--){var f=r[s][1],l=r[s][0];for(var u=0,c=l.length;u=0;n--){var r=this.items[n];if(r.instance!=this.currentContainer&&this.currentContainer&&r.item[0]!=this.currentItem[0])continue;var i=this.options.toleranceElement?e(this.options.toleranceElement,r.item):r.item;t||(r.width=i.outerWidth(),r.height=i.outerHeight());var s=i.offset();r.left=s.left,r.top=s.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var n=this.containers.length-1;n>=0;n--){var s=this.containers[n].element.offset();this.containers[n].containerCache.left=s.left,this.containers[n].containerCache.top=s.top,this.containers[n].containerCache.width=this.containers[n].element.outerWidth(),this.containers[n].containerCache.height=this.containers[n].element.outerHeight()}return this},_createPlaceholder:function(t){t=t||this;var n=t.options;if(!n.placeholder||n.placeholder.constructor==String){var r=n.placeholder;n.placeholder={element:function(){var n=e(document.createElement(t.currentItem[0].nodeName)).addClass(r||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return r||(n.style.visibility="hidden"),n},update:function(e,i){if(r&&!n.forcePlaceholderSize)return;i.height()||i.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),i.width()||i.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10))}}}t.placeholder=e(n.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),n.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var n=null,r=null;for(var i=this.containers.length-1;i>=0;i--){if(e.contains(this.currentItem[0],this.containers[i].element[0]))continue;if(this._intersectsWith(this.containers[i].containerCache)){if(n&&e.contains(this.containers[i].element[0],n.element[0]))continue;n=this.containers[i],r=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0)}if(!n)return;if(this.containers.length===1)this.containers[r]._trigger("over",t,this._uiHash(this)),this.containers[r].containerCache.over=1;else{var s=1e4,o=null,u=this.containers[r].floating?"left":"top",a=this.containers[r].floating?"width":"height",f=this.positionAbs[u]+this.offset.click[u];for(var l=this.items.length-1;l>=0;l--){if(!e.contains(this.containers[r].element[0],this.items[l].item[0]))continue;if(this.items[l].item[0]==this.currentItem[0])continue;var c=this.items[l].item.offset()[u],h=!1;Math.abs(c-f)>Math.abs(c+this.items[l][a]-f)&&(h=!0,c+=this.items[l][a]),Math.abs(c-f)this.containment[2]&&(s=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top));if(n.grid){var u=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1];o=this.containment?u-this.offset.click.topthis.containment[3]?u-this.offset.click.topthis.containment[2]?a-this.offset.click.left=0;i--)n||r.push(function(e){return function(t){e._trigger("deactivate",t,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(r.push(function(e){return function(t){e._trigger("out",t,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);this._storedCursor&&e("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!n){this._trigger("beforeStop",t,this._uiHash());for(var i=0;i",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},n=this.element;return e.each(["min","max","step"],function(e,r){var i=n.attr(r);i!==undefined&&i.length&&(t[r]=i)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e)},mousewheel:function(e,t){if(!t)return;if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()},"mousedown .ui-spinner-button":function(t){function r(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=n,this._delay(function(){this.previous=n}))}var n;n=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),r.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,r.call(this)});if(this._start(t)===!1)return;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){if(!e(t.currentTarget).hasClass("ui-state-active"))return;if(this._start(t)===!1)return!1;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(e.height()*.5)&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var n=this.options,r=e.ui.keyCode;switch(t.keyCode){case r.UP:return this._repeat(null,1,t),!0;case r.DOWN:return this._repeat(null,-1,t),!0;case r.PAGE_UP:return this._repeat(null,n.page,t),!0;case r.PAGE_DOWN:return this._repeat(null,-n.page,t),!0}return!1},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return""+""+""+""+""},_start:function(e){return!this.spinning&&this._trigger("start",e)===!1?!1:(this.counter||(this.counter=1),this.spinning=!0,!0)},_repeat:function(e,t,n){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,n)},e),this._spin(t*this.options.step,n)},_spin:function(e,t){var n=this.value()||0;this.counter||(this.counter=1),n=this._adjustValue(n+e*this._increment(this.counter));if(!this.spinning||this._trigger("spin",t,{value:n})!==!1)this._value(n),this.counter++},_increment:function(t){var n=this.options.incremental;return n?e.isFunction(n)?n(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return this.options.min!==null&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=e.toString(),n=t.indexOf(".");return n===-1?0:t.length-n-1},_adjustValue:function(e){var t,n,r=this.options;return t=r.min!==null?r.min:0,n=e-t,n=Math.round(n/r.step)*r.step,e=t+n,e=parseFloat(e.toFixed(this._precision())),r.max!==null&&e>r.max?r.max:r.min!==null&&e1&&e.href.replace(r,"")===location.href.replace(r,"")}var n=0,r=/#.*$/;e.widget("ui.tabs",{version:"1.9.1",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var t=this,n=this.options,r=n.active,i=location.hash.substring(1);this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",n.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs();if(r===null){i&&this.tabs.each(function(t,n){if(e(n).attr("aria-controls")===i)return r=t,!1}),r===null&&(r=this.tabs.index(this.tabs.filter(".ui-tabs-active")));if(r===null||r===-1)r=this.tabs.length?0:!1}r!==!1&&(r=this.tabs.index(this.tabs.eq(r)),r===-1&&(r=n.collapsible?!1:0)),n.active=r,!n.collapsible&&n.active===!1&&this.anchors.length&&(n.active=0),e.isArray(n.disabled)&&(n.disabled=e.unique(n.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.options.active!==!1&&this.anchors.length?this.active=this._findActive(this.options.active):this.active=e(),this._refresh(),this.active.length&&this.load(n.active)},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var n=e(this.document[0].activeElement).closest("li"),r=this.tabs.index(n),i=!0;if(this._handlePageNav(t))return;switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:r++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:i=!1,r--;break;case e.ui.keyCode.END:r=this.anchors.length-1;break;case e.ui.keyCode.HOME:r=0;break;case e.ui.keyCode.SPACE:t.preventDefault(),clearTimeout(this.activating),this._activate(r);return;case e.ui.keyCode.ENTER:t.preventDefault(),clearTimeout(this.activating),this._activate(r===this.options.active?!1:r);return;default:return}t.preventDefault(),clearTimeout(this.activating),r=this._focusNextTab(r,i),t.ctrlKey||(n.attr("aria-selected","false"),this.tabs.eq(r).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",r)},this.delay))},_panelKeydown:function(t){if(this._handlePageNav(t))return;t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP)return this._activate(this._focusNextTab(this.options.active-1,!1)),!0;if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN)return this._activate(this._focusNextTab(this.options.active+1,!0)),!0},_findNextTab:function(t,n){function i(){return t>r&&(t=0),t<0&&(t=r),t}var r=this.tabs.length-1;while(e.inArray(i(),this.options.disabled)!==-1)t=n?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){if(e==="active"){this._activate(t);return}if(e==="disabled"){this._setupDisabled(t);return}this._super(e,t),e==="collapsible"&&(this.element.toggleClass("ui-tabs-collapsible",t),!t&&this.options.active===!1&&this._activate(0)),e==="event"&&this._setupEvents(t),e==="heightStyle"&&this._setupHeightStyle(t)},_tabId:function(e){return e.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,n=this.tablist.children(":has(a[href])");t.disabled=e.map(n.filter(".ui-state-disabled"),function(e){return n.index(e)}),this._processTabs(),t.active===!1||!this.anchors.length?(t.active=!1,this.active=e()):this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(n,r){var i,o,u,a=e(r).uniqueId().attr("id"),f=e(r).closest("li"),l=f.attr("aria-controls");s(r)?(i=r.hash,o=t.element.find(t._sanitizeSelector(i))):(u=t._tabId(f),i="#"+u,o=t.element.find(i),o.length||(o=t._createPanel(u),o.insertAfter(t.panels[n-1]||t.tablist)),o.attr("aria-live","polite")),o.length&&(t.panels=t.panels.add(o)),l&&f.data("ui-tabs-aria-controls",l),f.attr({"aria-controls":i.substring(1),"aria-labelledby":a}),o.attr("aria-labelledby",a)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("
").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var n=0,r;r=this.tabs[n];n++)t===!0||e.inArray(n,t)!==-1?e(r).addClass("ui-state-disabled").attr("aria-disabled","true"):e(r).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var n={click:function(e){e.preventDefault()}};t&&e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,n),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var n,r,i=this.element.parent();t==="fill"?(e.support.minHeight||(r=i.css("overflow"),i.css("overflow","hidden")),n=i.height(),this.element.siblings(":visible").each(function(){var t=e(this),r=t.css("position");if(r==="absolute"||r==="fixed")return;n-=t.outerHeight(!0)}),r&&i.css("overflow",r),this.element.children().not(this.panels).each(function(){n-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,n-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):t==="auto"&&(n=0,this.panels.each(function(){n=Math.max(n,e(this).height("").height())}).height(n))},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i.closest("li"),o=s[0]===r[0],u=o&&n.collapsible,a=u?e():this._getPanelForTab(s),f=r.length?this._getPanelForTab(r):e(),l={oldTab:r,oldPanel:f,newTab:u?e():s,newPanel:a};t.preventDefault();if(s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||o&&!n.collapsible||this._trigger("beforeActivate",t,l)===!1)return;n.active=u?!1:this.tabs.index(s),this.active=o?e():s,this.xhr&&this.xhr.abort(),!f.length&&!a.length&&e.error("jQuery UI Tabs: Mismatching fragment identifier."),a.length&&this.load(this.tabs.index(s),t),this._toggle(t,l)},_toggle:function(t,n){function o(){r.running=!1,r._trigger("activate",t,n)}function u(){n.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),i.length&&r.options.show?r._show(i,r.options.show,o):(i.show(),o())}var r=this,i=n.newPanel,s=n.oldPanel;this.running=!0,s.length&&this.options.hide?this._hide(s,this.options.hide,function(){n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),u()}):(n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),s.hide(),u()),s.attr({"aria-expanded":"false","aria-hidden":"true"}),n.oldTab.attr("aria-selected","false"),i.length&&s.length?n.oldTab.attr("tabIndex",-1):i.length&&this.tabs.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}),n.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(t){var n,r=this._findActive(t);if(r[0]===this.active[0])return;r.length||(r=this.active),n=r.find(".ui-tabs-anchor")[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return typeof e=="string"&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeData("href.tabs").removeData("load.tabs").removeUniqueId(),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),n=t.data("ui-tabs-aria-controls");n?t.attr("aria-controls",n):t.removeAttr("aria-controls")}),this.options.heightStyle!=="content"&&this.panels.css("height","")},enable:function(n){var r=this.options.disabled;if(r===!1)return;n===t?r=!1:(n=this._getIndex(n),e.isArray(r)?r=e.map(r,function(e){return e!==n?e:null}):r=e.map(this.tabs,function(e,t){return t!==n?t:null})),this._setupDisabled(r)},disable:function(n){var r=this.options.disabled;if(r===!0)return;if(n===t)r=!0;else{n=this._getIndex(n);if(e.inArray(n,r)!==-1)return;e.isArray(r)?r=e.merge([n],r).sort():r=[n]}this._setupDisabled(r)},load:function(t,n){t=this._getIndex(t);var r=this,i=this.tabs.eq(t),o=i.find(".ui-tabs-anchor"),u=this._getPanelForTab(i),a={tab:i,panel:u};if(s(o[0]))return;this.xhr=e.ajax(this._ajaxSettings(o,n,a)),this.xhr&&this.xhr.statusText!=="canceled"&&(i.addClass("ui-tabs-loading"),u.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){u.html(e),r._trigger("load",n,a)},1)}).complete(function(e,t){setTimeout(function(){t==="abort"&&r.panels.stop(!1,!0),i.removeClass("ui-tabs-loading"),u.removeAttr("aria-busy"),e===r.xhr&&delete r.xhr},1)}))},_ajaxSettings:function(t,n,r){var i=this;return{url:t.attr("href"),beforeSend:function(t,s){return i._trigger("beforeLoad",n,e.extend({jqXHR:t,ajaxSettings:s},r))}}},_getPanelForTab:function(t){var n=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+n))}}),e.uiBackCompat!==!1&&(e.ui.tabs.prototype._ui=function(e,t){return{tab:e,panel:t,index:this.anchors.index(e)}},e.widget("ui.tabs",e.ui.tabs,{url:function(e,t){this.anchors.eq(e).attr("href",t)}}),e.widget("ui.tabs",e.ui.tabs,{options:{ajaxOptions:null,cache:!1},_create:function(){this._super();var t=this;this._on({tabsbeforeload:function(n,r){if(e.data(r.tab[0],"cache.tabs")){n.preventDefault();return}r.jqXHR.success(function(){t.options.cache&&e.data(r.tab[0],"cache.tabs",!0)})}})},_ajaxSettings:function(t,n,r){var i=this.options.ajaxOptions;return e.extend({},i,{error:function(e,t){try{i.error(e,t,r.tab.closest("li").index(),r.tab[0])}catch(n){}}},this._superApply(arguments))},_setOption:function(e,t){e==="cache"&&t===!1&&this.anchors.removeData("cache.tabs"),this._super(e,t)},_destroy:function(){this.anchors.removeData("cache.tabs"),this._super()},url:function(e){this.anchors.eq(e).removeData("cache.tabs"),this._superApply(arguments)}}),e.widget("ui.tabs",e.ui.tabs,{abort:function(){this.xhr&&this.xhr.abort()}}),e.widget("ui.tabs",e.ui.tabs,{options:{spinner:"Loading…"},_create:function(){this._super(),this._on({tabsbeforeload:function(e,t){if(e.target!==this.element[0]||!this.options.spinner)return;var n=t.tab.find("span"),r=n.html();n.html(this.options.spinner),t.jqXHR.complete(function(){n.html(r)})}})}}),e.widget("ui.tabs",e.ui.tabs,{options:{enable:null,disable:null},enable:function(t){var n=this.options,r;if(t&&n.disabled===!0||e.isArray(n.disabled)&&e.inArray(t,n.disabled)!==-1)r=!0;this._superApply(arguments),r&&this._trigger("enable",null,this._ui(this.anchors[t],this.panels[t]))},disable:function(t){var n=this.options,r;if(t&&n.disabled===!1||e.isArray(n.disabled)&&e.inArray(t,n.disabled)===-1)r=!0;this._superApply(arguments),r&&this._trigger("disable",null,this._ui(this.anchors[t],this.panels[t]))}}),e.widget("ui.tabs",e.ui.tabs,{options:{add:null,remove:null,tabTemplate:"
  • #{label}
  • "},add:function(n,r,i){i===t&&(i=this.anchors.length);var s,o,u=this.options,a=e(u.tabTemplate.replace(/#\{href\}/g,n).replace(/#\{label\}/g,r)),f=n.indexOf("#")?this._tabId(a):n.replace("#","");return a.addClass("ui-state-default ui-corner-top").data("ui-tabs-destroy",!0),a.attr("aria-controls",f),s=i>=this.tabs.length,o=this.element.find("#"+f),o.length||(o=this._createPanel(f),s?i>0?o.insertAfter(this.panels.eq(-1)):o.appendTo(this.element):o.insertBefore(this.panels[i])),o.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").hide(),s?a.appendTo(this.tablist):a.insertBefore(this.tabs[i]),u.disabled=e.map(u.disabled,function(e){return e>=i?++e:e}),this.refresh(),this.tabs.length===1&&u.active===!1&&this.option("active",0),this._trigger("add",null,this._ui(this.anchors[i],this.panels[i])),this},remove:function(t){t=this._getIndex(t);var n=this.options,r=this.tabs.eq(t).remove(),i=this._getPanelForTab(r).remove();return r.hasClass("ui-tabs-active")&&this.anchors.length>2&&this._activate(t+(t+1=t?--e:e}),this.refresh(),this._trigger("remove",null,this._ui(r.find("a")[0],i[0])),this}}),e.widget("ui.tabs",e.ui.tabs,{length:function(){return this.anchors.length}}),e.widget("ui.tabs",e.ui.tabs,{options:{idPrefix:"ui-tabs-"},_tabId:function(t){var n=t.is("li")?t.find("a[href]"):t;return n=n[0],e(n).closest("li").attr("aria-controls")||n.title&&n.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF\-]/g,"")||this.options.idPrefix+i()}}),e.widget("ui.tabs",e.ui.tabs,{options:{panelTemplate:"
    "},_createPanel:function(t){return e(this.options.panelTemplate).attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)}}),e.widget("ui.tabs",e.ui.tabs,{_create:function(){var e=this.options;e.active===null&&e.selected!==t&&(e.active=e.selected===-1?!1:e.selected),this._super(),e.selected=e.active,e.selected===!1&&(e.selected=-1)},_setOption:function(e,t){if(e!=="selected")return this._super(e,t);var n=this.options;this._super("active",t===-1?!1:t),n.selected=n.active,n.selected===!1&&(n.selected=-1)},_eventHandler:function(){this._superApply(arguments),this.options.selected=this.options.active,this.options.selected===!1&&(this.options.selected=-1)}}),e.widget("ui.tabs",e.ui.tabs,{options:{show:null,select:null},_create:function(){this._super(),this.options.active!==!1&&this._trigger("show",null,this._ui(this.active.find(".ui-tabs-anchor")[0],this._getPanelForTab(this.active)[0]))},_trigger:function(e,t,n){var r=this._superApply(arguments);return r?(e==="beforeActivate"&&n.newTab.length?r=this._super("select",t,{tab:n.newTab.find(".ui-tabs-anchor")[0],panel:n.newPanel[0],index:n.newTab.closest("li").index()}):e==="activate"&&n.newTab.length&&(r=this._super("show",t,{tab:n.newTab.find(".ui-tabs-anchor")[0],panel:n.newPanel[0],index:n.newTab.closest("li").index()})),r):!1}}),e.widget("ui.tabs",e.ui.tabs,{select:function(e){e=this._getIndex(e);if(e===-1){if(!this.options.collapsible||this.options.selected===-1)return;e=this.options.selected}this.anchors.eq(e).trigger(this.options.event+this.eventNamespace)}}),function(){var t=0;e.widget("ui.tabs",e.ui.tabs,{options:{cookie:null},_create:function(){var e=this.options,t;e.active==null&&e.cookie&&(t=parseInt(this._cookie(),10),t===-1&&(t=!1),e.active=t),this._super()},_cookie:function(n){var r=[this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++t)];return arguments.length&&(r.push(n===!1?-1:n),r.push(this.options.cookie)),e.cookie.apply(null,r)},_refresh:function(){this._super(),this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_eventHandler:function(){this._superApply(arguments),this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_destroy:function(){this._super(),this.options.cookie&&this._cookie(null,this.options.cookie)}})}(),e.widget("ui.tabs",e.ui.tabs,{_trigger:function(t,n,r){var i=e.extend({},r);return t==="load"&&(i.panel=i.panel[0],i.tab=i.tab.find(".ui-tabs-anchor")[0]),this._super(t,n,i)}}),e.widget("ui.tabs",e.ui.tabs,{options:{fx:null},_getFx:function(){var t,n,r=this.options.fx;return r&&(e.isArray(r)?(t=r[0],n=r[1]):t=n=r),r?{show:n,hide:t}:null},_toggle:function(e,t){function o(){n.running=!1,n._trigger("activate",e,t)}function u(){t.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),r.length&&s.show?r.animate(s.show,s.show.duration,function(){o()}):(r.show(),o())}var n=this,r=t.newPanel,i=t.oldPanel,s=this._getFx();if(!s)return this._super(e,t);n.running=!0,i.length&&s.hide?i.animate(s.hide,s.hide.duration,function(){t.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),u()}):(t.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),i.hide(),u())}}))})(jQuery);(function(e){function n(t,n){var r=(t.attr("aria-describedby")||"").split(/\s+/);r.push(n),t.data("ui-tooltip-id",n).attr("aria-describedby",e.trim(r.join(" ")))}function r(t){var n=t.data("ui-tooltip-id"),r=(t.attr("aria-describedby")||"").split(/\s+/),i=e.inArray(n,r);i!==-1&&r.splice(i,1),t.removeData("ui-tooltip-id"),r=e.trim(r.join(" ")),r?t.attr("aria-describedby",r):t.removeAttr("aria-describedby")}var t=0;e.widget("ui.tooltip",{version:"1.9.1",options:{content:function(){return e(this).attr("title")},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flipfit"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable()},_setOption:function(t,n){var r=this;if(t==="disabled"){this[n?"_disable":"_enable"](),this.options[t]=n;return}this._super(t,n),t==="content"&&e.each(this.tooltips,function(e,t){r._updateContent(t)})},_disable:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0)}),this.element.find(this.options.items).andSelf().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).andSelf().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var n=this,r=e(t?t.target:this.element).closest(this.options.items);if(!r.length)return;if(this.options.track&&r.data("ui-tooltip-id")){this._find(r).position(e.extend({of:r},this.options.position)),this._off(this.document,"mousemove");return}r.attr("title")&&r.data("ui-tooltip-title",r.attr("title")),r.data("tooltip-open",!0),t&&t.type==="mouseover"&&r.parents().each(function(){var t;e(this).data("tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,n.close(t,!0)),this.title&&(e(this).uniqueId(),n.parents[this.id]={element:this,title:this.title},this.title="")}),this._updateContent(r,t)},_updateContent:function(e,t){var n,r=this.options.content,i=this;if(typeof r=="string")return this._open(t,e,r);n=r.call(e[0],function(n){if(!e.data("tooltip-open"))return;i._delay(function(){this._open(t,e,n)})}),n&&this._open(t,e,n)},_open:function(t,r,i){function f(e){a.of=e;if(s.is(":hidden"))return;s.position(a)}var s,o,u,a=e.extend({},this.options.position);if(!i)return;s=this._find(r);if(s.length){s.find(".ui-tooltip-content").html(i);return}r.is("[title]")&&(t&&t.type==="mouseover"?r.attr("title",""):r.removeAttr("title")),s=this._tooltip(r),n(r,s.attr("id")),s.find(".ui-tooltip-content").html(i),this.options.track&&t&&/^mouse/.test(t.originalEvent.type)?(this._on(this.document,{mousemove:f}),f(t)):s.position(e.extend({of:r},this.options.position)),s.hide(),this._show(s,this.options.show),this.options.show&&this.options.show.delay&&(u=setInterval(function(){s.is(":visible")&&(f(a.of),clearInterval(u))},e.fx.interval)),this._trigger("open",t,{tooltip:s}),o={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var n=e.Event(t);n.currentTarget=r[0],this.close(n,!0)}},remove:function(){this._removeTooltip(s)}};if(!t||t.type==="mouseover")o.mouseleave="close";if(!t||t.type==="focusin")o.focusout="close";this._on(r,o)},close:function(t){var n=this,i=e(t?t.currentTarget:this.element),s=this._find(i);if(this.closing)return;i.data("ui-tooltip-title")&&i.attr("title",i.data("ui-tooltip-title")),r(i),s.stop(!0),this._hide(s,this.options.hide,function(){n._removeTooltip(e(this))}),i.removeData("tooltip-open"),this._off(i,"mouseleave focusout keyup"),i[0]!==this.element[0]&&this._off(i,"remove"),this._off(this.document,"mousemove"),t&&t.type==="mouseleave"&&e.each(this.parents,function(e,t){t.element.title=t.title,delete n.parents[e]}),this.closing=!0,this._trigger("close",t,{tooltip:s}),this.closing=!1},_tooltip:function(n){var r="ui-tooltip-"+t++,i=e("
    ").attr({id:r,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return e("
    ").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),e.fn.bgiframe&&i.bgiframe(),this.tooltips[r]=n,i},_find:function(t){var n=t.data("ui-tooltip-id");return n?e("#"+n):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0),e("#"+n).remove(),r.data("ui-tooltip-title")&&(r.attr("title",r.data("ui-tooltip-title")),r.removeData("ui-tooltip-title"))})}})})(jQuery); \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-ui-1.9.1.custom.min.js.gz b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/webapps/static/jquery/jquery-ui-1.9.1.custom.min.js.gz deleted file mode 100644 index abdb4b1c84ba613502320d19df7a662f1407a4bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62855 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 css_rules.length + 5) { return false; } + if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) { + if(delete_flag === true) { + if(sheet.removeRule) { sheet.removeRule(j); } + if(sheet.deleteRule) { sheet.deleteRule(j); } + return true; + } + else { return css_rules[j]; } + } + } + while (css_rules[++j]); + return false; + }, + add_css : function(rule_name, sheet) { + if($.jstree.css.get_css(rule_name, false, sheet)) { return false; } + if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); } + return $.vakata.css.get_css(rule_name); + }, + remove_css : function(rule_name, sheet) { + return $.vakata.css.get_css(rule_name, true, sheet); + }, + add_sheet : function(opts) { + var tmp = false, is_new = true; + if(opts.str) { + if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; } + if(tmp) { is_new = false; } + else { + tmp = document.createElement("style"); + tmp.setAttribute('type',"text/css"); + if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); } + } + if(tmp.styleSheet) { + if(is_new) { + document.getElementsByTagName("head")[0].appendChild(tmp); + tmp.styleSheet.cssText = opts.str; + } + else { + tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str; + } + } + else { + tmp.appendChild(document.createTextNode(opts.str)); + document.getElementsByTagName("head")[0].appendChild(tmp); + } + return tmp.sheet || tmp.styleSheet; + } + if(opts.url) { + if(document.createStyleSheet) { + try { tmp = document.createStyleSheet(opts.url); } catch (e) { } + } + else { + tmp = document.createElement('link'); + tmp.rel = 'stylesheet'; + tmp.type = 'text/css'; + tmp.media = "all"; + tmp.href = opts.url; + document.getElementsByTagName("head")[0].appendChild(tmp); + return tmp.styleSheet; + } + } + } + }; + + // private variables + var instances = [], // instance array (used by $.jstree.reference/create/focused) + focused_instance = -1, // the index in the instance array of the currently focused instance + plugins = {}, // list of included plugins + prepared_move = {}; // for the move_node function + + // jQuery plugin wrapper (thanks to jquery UI widget function) + $.fn.jstree = function (settings) { + var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node") + args = Array.prototype.slice.call(arguments, 1), + returnValue = this; + + // if a method call execute the method on all selected instances + if(isMethodCall) { + if(settings.substring(0, 1) == '_') { return returnValue; } + this.each(function() { + var instance = instances[$.data(this, "jstree-instance-id")], + methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance; + if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; } + }); + } + else { + this.each(function() { + // extend settings and allow for multiple hashes and $.data + var instance_id = $.data(this, "jstree-instance-id"), + a = [], + b = settings ? $.extend({}, true, settings) : {}, + c = $(this), + s = false, + t = []; + a = a.concat(args); + if(c.data("jstree")) { a.push(c.data("jstree")); } + b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b; + + // if an instance already exists, destroy it first + if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); } + // push a new empty object to the instances array + instance_id = parseInt(instances.push({}),10) - 1; + // store the jstree instance id to the container element + $.data(this, "jstree-instance-id", instance_id); + // clean up all plugins + b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice(); + b.plugins.unshift("core"); + // only unique plugins + b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(","); + + // extend defaults with passed data + s = $.extend(true, {}, $.jstree.defaults, b); + s.plugins = b.plugins; + $.each(plugins, function (i, val) { + if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } + else { t.push(i); } + }); + s.plugins = t; + + // push the new object to the instances array (at the same time set the default classes to the container) and init + instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s); + // init all activated plugins for this instance + $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; }); + $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } }); + // initialize the instance + setTimeout(function() { instances[instance_id].init(); }, 0); + }); + } + // return the jquery selection (or if it was a method call that returned a value - the returned value) + return returnValue; + }; + // object to store exposed functions and objects + $.jstree = { + defaults : { + plugins : [] + }, + _focused : function () { return instances[focused_instance] || null; }, + _reference : function (needle) { + // get by instance id + if(instances[needle]) { return instances[needle]; } + // get by DOM (if still no luck - return null + var o = $(needle); + if(!o.length && typeof needle === "string") { o = $("#" + needle); } + if(!o.length) { return null; } + return instances[o.closest(".jstree").data("jstree-instance-id")] || null; + }, + _instance : function (index, container, settings) { + // for plugins to store data in + this.data = { core : {} }; + this.get_settings = function () { return $.extend(true, {}, settings); }; + this._get_settings = function () { return settings; }; + this.get_index = function () { return index; }; + this.get_container = function () { return container; }; + this.get_container_ul = function () { return container.children("ul:eq(0)"); }; + this._set_settings = function (s) { + settings = $.extend(true, {}, settings, s); + }; + }, + _fn : { }, + plugin : function (pname, pdata) { + pdata = $.extend({}, { + __init : $.noop, + __destroy : $.noop, + _fn : {}, + defaults : false + }, pdata); + plugins[pname] = pdata; + + $.jstree.defaults[pname] = pdata.defaults; + $.each(pdata._fn, function (i, val) { + val.plugin = pname; + val.old = $.jstree._fn[i]; + $.jstree._fn[i] = function () { + var rslt, + func = val, + args = Array.prototype.slice.call(arguments), + evnt = new $.Event("before.jstree"), + rlbk = false; + + if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; } + + // Check if function belongs to the included plugins of this instance + do { + if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; } + func = func.old; + } while(func); + if(!func) { return; } + + // context and function to trigger events, then finally call the function + if(i.indexOf("_") === 0) { + rslt = func.apply(this, args); + } + else { + rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin }); + if(rslt === false) { return; } + if(typeof rslt !== "undefined") { args = rslt; } + + rslt = func.apply( + $.extend({}, this, { + __callback : function (data) { + this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk }); + }, + __rollback : function () { + rlbk = this.get_rollback(); + return rlbk; + }, + __call_old : function (replace_arguments) { + return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) ); + } + }), args); + } + + // return the result + return rslt; + }; + $.jstree._fn[i].old = val.old; + $.jstree._fn[i].plugin = pname; + }); + }, + rollback : function (rb) { + if(rb) { + if(!$.isArray(rb)) { rb = [ rb ]; } + $.each(rb, function (i, val) { + instances[val.i].set_rollback(val.h, val.d); + }); + } + } + }; + // set the prototype for all instances + $.jstree._fn = $.jstree._instance.prototype = {}; + + // load the css when DOM is ready + $(function() { + // code is copied from jQuery ($.browser is deprecated + there is a bug in IE) + var u = navigator.userAgent.toLowerCase(), + v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1], + css_string = '' + + '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' + + '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' + + '.jstree-rtl li { margin-left:0; margin-right:18px; } ' + + '.jstree > ul > li { margin-left:0px; } ' + + '.jstree-rtl > ul > li { margin-right:0px; } ' + + '.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' + + '.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' + + '.jstree a:focus { outline: none; } ' + + '.jstree a > ins { height:16px; width:16px; } ' + + '.jstree a > .jstree-icon { margin-right:3px; } ' + + '.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' + + 'li.jstree-open > ul { display:block; } ' + + 'li.jstree-closed > ul { display:none; } '; + // Correct IE 6 (does not support the > CSS selector) + if(/msie/.test(u) && parseInt(v, 10) == 6) { + is_ie6 = true; + + // fix image flicker and lack of caching + try { + document.execCommand("BackgroundImageCache", false, true); + } catch (err) { } + + css_string += '' + + '.jstree li { height:18px; margin-left:0; margin-right:0; } ' + + '.jstree li li { margin-left:18px; } ' + + '.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' + + 'li.jstree-open ul { display:block; } ' + + 'li.jstree-closed ul { display:none !important; } ' + + '.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' + + '.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' + + '.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } '; + } + // Correct IE 7 (shifts anchor nodes onhover) + if(/msie/.test(u) && parseInt(v, 10) == 7) { + is_ie7 = true; + css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } '; + } + // correct ff2 lack of display:inline-block + if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) { + is_ff2 = true; + css_string += '' + + '.jstree ins { display:-moz-inline-box; } ' + + '.jstree li { line-height:12px; } ' + // WHY?? + '.jstree a { display:-moz-inline-box; } ' + + '.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } '; + /* this shouldn't be here as it is theme specific */ + } + // the default stylesheet + $.vakata.css.add_sheet({ str : css_string, title : "jstree" }); + }); + + // core functions (open, close, create, update, delete) + $.jstree.plugin("core", { + __init : function () { + this.data.core.locked = false; + this.data.core.to_open = this.get_settings().core.initially_open; + this.data.core.to_load = this.get_settings().core.initially_load; + }, + defaults : { + html_titles : false, + animation : 500, + initially_open : [], + initially_load : [], + open_parents : true, + notify_plugins : true, + rtl : false, + load_open : false, + strings : { + loading : "Loading ...", + new_node : "New node", + multiple_selection : "Multiple selection" + } + }, + _fn : { + init : function () { + this.set_focus(); + if(this._get_settings().core.rtl) { + this.get_container().addClass("jstree-rtl").css("direction", "rtl"); + } + this.get_container().html(""); + this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18; + + this.get_container() + .delegate("li > ins", "click.jstree", $.proxy(function (event) { + var trgt = $(event.target); + if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); } + }, this)) + .bind("mousedown.jstree", $.proxy(function () { + this.set_focus(); // This used to be setTimeout(set_focus,0) - why? + }, this)) + .bind("dblclick.jstree", function (event) { + var sel; + if(document.selection && document.selection.empty) { document.selection.empty(); } + else { + if(window.getSelection) { + sel = window.getSelection(); + try { + sel.removeAllRanges(); + sel.collapse(); + } catch (err) { } + } + } + }); + if(this._get_settings().core.notify_plugins) { + this.get_container() + .bind("load_node.jstree", $.proxy(function (e, data) { + var o = this._get_node(data.rslt.obj), + t = this; + if(o === -1) { o = this.get_container_ul(); } + if(!o.length) { return; } + o.find("li").each(function () { + var th = $(this); + if(th.data("jstree")) { + $.each(th.data("jstree"), function (plugin, values) { + if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) { + t["_" + plugin + "_notify"].call(t, th, values); + } + }); + } + }); + }, this)); + } + if(this._get_settings().core.load_open) { + this.get_container() + .bind("load_node.jstree", $.proxy(function (e, data) { + var o = this._get_node(data.rslt.obj), + t = this; + if(o === -1) { o = this.get_container_ul(); } + if(!o.length) { return; } + o.find("li.jstree-open:not(:has(ul))").each(function () { + t.load_node(this, $.noop, $.noop); + }); + }, this)); + } + this.__callback(); + this.load_node(-1, function () { this.loaded(); this.reload_nodes(); }); + }, + destroy : function () { + var i, + n = this.get_index(), + s = this._get_settings(), + _this = this; + + $.each(s.plugins, function (i, val) { + try { plugins[val].__destroy.apply(_this); } catch(err) { } + }); + this.__callback(); + // set focus to another instance if this one is focused + if(this.is_focused()) { + for(i in instances) { + if(instances.hasOwnProperty(i) && i != n) { + instances[i].set_focus(); + break; + } + } + } + // if no other instance found + if(n === focused_instance) { focused_instance = -1; } + // remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events + this.get_container() + .unbind(".jstree") + .undelegate(".jstree") + .removeData("jstree-instance-id") + .find("[class^='jstree']") + .andSelf() + .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); }); + $(document) + .unbind(".jstree-" + n) + .undelegate(".jstree-" + n); + // remove the actual data + instances[n] = null; + delete instances[n]; + }, + + _core_notify : function (n, data) { + if(data.opened) { + this.open_node(n, false, true); + } + }, + + lock : function () { + this.data.core.locked = true; + this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7"); + this.__callback({}); + }, + unlock : function () { + this.data.core.locked = false; + this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1"); + this.__callback({}); + }, + is_locked : function () { return this.data.core.locked; }, + save_opened : function () { + var _this = this; + this.data.core.to_open = []; + this.get_container_ul().find("li.jstree-open").each(function () { + if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } + }); + this.__callback(_this.data.core.to_open); + }, + save_loaded : function () { }, + reload_nodes : function (is_callback) { + var _this = this, + done = true, + current = [], + remaining = []; + if(!is_callback) { + this.data.core.reopen = false; + this.data.core.refreshing = true; + this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + if(this.data.core.to_open.length) { + this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open); + } + } + if(this.data.core.to_load.length) { + $.each(this.data.core.to_load, function (i, val) { + if(val == "#") { return true; } + if($(val).length) { current.push(val); } + else { remaining.push(val); } + }); + if(current.length) { + this.data.core.to_load = remaining; + $.each(current, function (i, val) { + if(!_this._is_loaded(val)) { + _this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); }); + done = false; + } + }); + } + } + if(this.data.core.to_open.length) { + $.each(this.data.core.to_open, function (i, val) { + _this.open_node(val, false, true); + }); + } + if(done) { + // TODO: find a more elegant approach to syncronizing returning requests + if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); } + this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50); + this.data.core.refreshing = false; + this.reopen(); + } + }, + reopen : function () { + var _this = this; + if(this.data.core.to_open.length) { + $.each(this.data.core.to_open, function (i, val) { + _this.open_node(val, false, true); + }); + } + this.__callback({}); + }, + refresh : function (obj) { + var _this = this; + this.save_opened(); + if(!obj) { obj = -1; } + obj = this._get_node(obj); + if(!obj) { obj = -1; } + if(obj !== -1) { obj.children("UL").remove(); } + else { this.get_container_ul().empty(); } + this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); }); + }, + // Dummy function to fire after the first load (so that there is a jstree.loaded event) + loaded : function () { + this.__callback(); + }, + // deal with focus + set_focus : function () { + if(this.is_focused()) { return; } + var f = $.jstree._focused(); + if(f) { f.unset_focus(); } + + this.get_container().addClass("jstree-focused"); + focused_instance = this.get_index(); + this.__callback(); + }, + is_focused : function () { + return focused_instance == this.get_index(); + }, + unset_focus : function () { + if(this.is_focused()) { + this.get_container().removeClass("jstree-focused"); + focused_instance = -1; + } + this.__callback(); + }, + + // traverse + _get_node : function (obj) { + var $obj = $(obj, this.get_container()); + if($obj.is(".jstree") || obj == -1) { return -1; } + $obj = $obj.closest("li", this.get_container()); + return $obj.length ? $obj : false; + }, + _get_next : function (obj, strict) { + obj = this._get_node(obj); + if(obj === -1) { return this.get_container().find("> ul > li:first-child"); } + if(!obj.length) { return false; } + if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; } + + if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); } + else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); } + else { return obj.parentsUntil(".jstree","li").next("li").eq(0); } + }, + _get_prev : function (obj, strict) { + obj = this._get_node(obj); + if(obj === -1) { return this.get_container().find("> ul > li:last-child"); } + if(!obj.length) { return false; } + if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; } + + if(obj.prev("li").length) { + obj = obj.prev("li").eq(0); + while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); } + return obj; + } + else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; } + }, + _get_parent : function (obj) { + obj = this._get_node(obj); + if(obj == -1 || !obj.length) { return false; } + var o = obj.parentsUntil(".jstree", "li:eq(0)"); + return o.length ? o : -1; + }, + _get_children : function (obj) { + obj = this._get_node(obj); + if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); } + if(!obj.length) { return false; } + return obj.children("ul:eq(0)").children("li"); + }, + get_path : function (obj, id_mode) { + var p = [], + _this = this; + obj = this._get_node(obj); + if(obj === -1 || !obj || !obj.length) { return false; } + obj.parentsUntil(".jstree", "li").each(function () { + p.push( id_mode ? this.id : _this.get_text(this) ); + }); + p.reverse(); + p.push( id_mode ? obj.attr("id") : this.get_text(obj) ); + return p; + }, + + // string functions + _get_string : function (key) { + return this._get_settings().core.strings[key] || key; + }, + + is_open : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); }, + is_closed : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); }, + is_leaf : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); }, + correct_state : function (obj) { + obj = this._get_node(obj); + if(!obj || obj === -1) { return false; } + obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove(); + this.__callback({ "obj" : obj }); + }, + // open/close + open_node : function (obj, callback, skip_animation) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; } + var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation, + t = this; + if(!this._is_loaded(obj)) { + obj.children("a").addClass("jstree-loading"); + this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback); + } + else { + if(this._get_settings().core.open_parents) { + obj.parentsUntil(".jstree",".jstree-closed").each(function () { + t.open_node(this, false, true); + }); + } + if(s) { obj.children("ul").css("display","none"); } + obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading"); + if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); } + else { t.after_open(obj); } + this.__callback({ "obj" : obj }); + if(callback) { callback.call(); } + } + }, + after_open : function (obj) { this.__callback({ "obj" : obj }); }, + close_node : function (obj, skip_animation) { + obj = this._get_node(obj); + var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation, + t = this; + if(!obj.length || !obj.hasClass("jstree-open")) { return false; } + if(s) { obj.children("ul").attr("style","display:block !important"); } + obj.removeClass("jstree-open").addClass("jstree-closed"); + if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); } + else { t.after_close(obj); } + this.__callback({ "obj" : obj }); + }, + after_close : function (obj) { this.__callback({ "obj" : obj }); }, + toggle_node : function (obj) { + obj = this._get_node(obj); + if(obj.hasClass("jstree-closed")) { return this.open_node(obj); } + if(obj.hasClass("jstree-open")) { return this.close_node(obj); } + }, + open_all : function (obj, do_animation, original_obj) { + obj = obj ? this._get_node(obj) : -1; + if(!obj || obj === -1) { obj = this.get_container_ul(); } + if(original_obj) { + obj = obj.find("li.jstree-closed"); + } + else { + original_obj = obj; + if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); } + else { obj = obj.find("li.jstree-closed"); } + } + var _this = this; + obj.each(function () { + var __this = this; + if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); } + else { _this.open_node(this, false, !do_animation); } + }); + // so that callback is fired AFTER all nodes are open + if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); } + }, + close_all : function (obj, do_animation) { + var _this = this; + obj = obj ? this._get_node(obj) : this.get_container(); + if(!obj || obj === -1) { obj = this.get_container_ul(); } + obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this, !do_animation); }); + this.__callback({ "obj" : obj }); + }, + clean_node : function (obj) { + obj = obj && obj != -1 ? $(obj) : this.get_container_ul(); + obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li"); + obj.removeClass("jstree-last") + .filter("li:last-child").addClass("jstree-last").end() + .filter(":has(li)") + .not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed"); + obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove(); + this.__callback({ "obj" : obj }); + }, + // rollback + get_rollback : function () { + this.__callback(); + return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data }; + }, + set_rollback : function (html, data) { + this.get_container().empty().append(html); + this.data = data; + this.__callback(); + }, + // Dummy functions to be overwritten by any datastore plugin included + load_node : function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); }, + _is_loaded : function (obj) { return true; }, + + // Basic operations: create + create_node : function (obj, position, js, callback, is_loaded) { + obj = this._get_node(obj); + position = typeof position === "undefined" ? "last" : position; + var d = $("
  • "), + s = this._get_settings().core, + tmp; + + if(obj !== -1 && !obj.length) { return false; } + if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; } + + this.__rollback(); + + if(typeof js === "string") { js = { "data" : js }; } + if(!js) { js = {}; } + if(js.attr) { d.attr(js.attr); } + if(js.metadata) { d.data(js.metadata); } + if(js.state) { d.addClass("jstree-" + js.state); } + if(!js.data) { js.data = this._get_string("new_node"); } + if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); } + $.each(js.data, function (i, m) { + tmp = $(""); + if($.isFunction(m)) { m = m.call(this, js); } + if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); } + else { + if(!m.attr) { m.attr = {}; } + if(!m.attr.href) { m.attr.href = '#'; } + tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title); + if(m.language) { tmp.addClass(m.language); } + } + tmp.prepend(" "); + if(m.icon) { + if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); } + else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); } + } + d.append(tmp); + }); + d.prepend(" "); + if(obj === -1) { + obj = this.get_container(); + if(position === "before") { position = "first"; } + if(position === "after") { position = "last"; } + } + switch(position) { + case "before": obj.before(d); tmp = this._get_parent(obj); break; + case "after" : obj.after(d); tmp = this._get_parent(obj); break; + case "inside": + case "first" : + if(!obj.children("ul").length) { obj.append("