summaryrefslogtreecommitdiff
path: root/qpid/java/broker-plugins/management-http
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/java/broker-plugins/management-http')
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java8
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java48
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java32
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java6
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java29
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java8
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java9
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java2
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java6
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java3
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java3
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java8
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java4
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java13
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js39
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js12
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html4
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/add.html4
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/edit.html4
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/filebased/edit.html4
-rw-r--r--qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/json/add.html4
24 files changed, 196 insertions, 81 deletions
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
index 613218f2fc..d29144f09b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
@@ -111,6 +111,9 @@ public class HttpManagement extends AbstractPluginAdapter<HttpManagement> implem
@ManagedAttributeField
private int _sessionTimeout;
+ @ManagedAttributeField
+ private boolean _compressResponses;
+
private boolean _allowPortActivation;
@ManagedObjectFactoryConstructor
@@ -477,6 +480,12 @@ public class HttpManagement extends AbstractPluginAdapter<HttpManagement> implem
}
@Override
+ public boolean isCompressResponses()
+ {
+ return _compressResponses;
+ }
+
+ @Override
public AuthenticationProvider getAuthenticationProvider(SocketAddress localAddress)
{
return getBroker().getAuthenticationProvider(localAddress);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java
index aff9f3a7e2..9eef1a6e5c 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementConfiguration.java
@@ -29,6 +29,7 @@ import org.apache.qpid.server.model.Plugin;
public interface HttpManagementConfiguration<X extends HttpManagementConfiguration<X>> extends Plugin<X>
{
+
@ManagedAttribute( defaultValue = "true" )
boolean isHttpsSaslAuthenticationEnabled();
@@ -44,6 +45,13 @@ public interface HttpManagementConfiguration<X extends HttpManagementConfigurati
@ManagedAttribute( defaultValue = "600" )
public int getSessionTimeout();
+ String HTTP_MANAGEMENT_COMPRESS_RESPONSES = "httpManagement.compressResponses";
+ @ManagedContextDefault(name = HTTP_MANAGEMENT_COMPRESS_RESPONSES)
+ boolean DEFAULT_COMPRESS_RESPONSES = false;
+
+ @ManagedAttribute( defaultValue = "${"+HTTP_MANAGEMENT_COMPRESS_RESPONSES+"}" )
+ public boolean isCompressResponses();
+
String MAX_HTTP_FILE_UPLOAD_SIZE_CONTEXT_NAME = "maxHttpFileUploadSize";
@ManagedContextDefault( name = MAX_HTTP_FILE_UPLOAD_SIZE_CONTEXT_NAME)
static final long DEFAULT_MAX_UPLOAD_SIZE = 100 * 1024;
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java
index ef0a68a42b..847ada3407 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagementUtil.java
@@ -20,17 +20,24 @@
*/
package org.apache.qpid.server.management.plugin;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.security.Principal;
import java.security.PrivilegedAction;
import java.security.cert.X509Certificate;
import java.util.Collections;
+import java.util.zip.GZIPOutputStream;
import javax.security.auth.Subject;
import javax.security.auth.x500.X500Principal;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.codec.binary.Base64;
@@ -71,6 +78,10 @@ public class HttpManagementUtil
private static final String ATTR_SUBJECT = "Qpid.subject";
private static final String ATTR_LOG_ACTOR = "Qpid.logActor";
+ private static final String ACCEPT_ENCODING_HEADER = "Accept-Encoding";
+ private static final String CONTENT_ENCODING_HEADER = "Content-Encoding";
+ private static final String GZIP_CONTENT_ENCODING = "gzip";
+
public static Broker<?> getBroker(ServletContext servletContext)
{
return (Broker<?>) servletContext.getAttribute(ATTR_BROKER);
@@ -219,5 +230,42 @@ public class HttpManagementUtil
return null;
}
+ public static Writer getOutputWriter(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return getOutputWriter(request, response, getManagementConfiguration(request.getServletContext()));
+ }
+
+ public static Writer getOutputWriter(final HttpServletRequest request, final HttpServletResponse response, HttpManagementConfiguration managementConfiguration)
+ throws IOException
+ {
+ Writer writer;
+ writer = new BufferedWriter(new OutputStreamWriter(getOutputStream(request,response, managementConfiguration)));
+ return writer;
+ }
+
+ public static OutputStream getOutputStream(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return getOutputStream(request, response, getManagementConfiguration(request.getServletContext()));
+ }
+
+ public static OutputStream getOutputStream(final HttpServletRequest request, final HttpServletResponse response, HttpManagementConfiguration managementConfiguration)
+ throws IOException
+ {
+ OutputStream outputStream;
+ if(managementConfiguration.isCompressResponses()
+ && Collections.list(request.getHeaderNames()).contains(ACCEPT_ENCODING_HEADER)
+ && request.getHeader(ACCEPT_ENCODING_HEADER).contains(GZIP_CONTENT_ENCODING))
+ {
+ outputStream = new GZIPOutputStream(response.getOutputStream());
+ response.setHeader(CONTENT_ENCODING_HEADER, GZIP_CONTENT_ENCODING);
+ }
+ else
+ {
+ outputStream = response.getOutputStream();
+ }
+ return outputStream;
+ }
}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java
index e6ae47dcff..d8f8e4e4b0 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/DefinedFileServlet.java
@@ -18,14 +18,16 @@ package org.apache.qpid.server.management.plugin.servlet;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.qpid.server.management.plugin.HttpManagementUtil;
+
public class DefinedFileServlet extends HttpServlet
{
@@ -57,23 +59,25 @@ public class DefinedFileServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
- final ServletOutputStream output = response.getOutputStream();
- InputStream fileInput = getClass().getResourceAsStream("/resources/"+_filename);
-
- if(fileInput != null)
+ try (OutputStream output = HttpManagementUtil.getOutputStream(request, response))
{
- byte[] buffer = new byte[1024];
- response.setStatus(HttpServletResponse.SC_OK);
- int read = 0;
+ InputStream fileInput = getClass().getResourceAsStream("/resources/" + _filename);
- while((read = fileInput.read(buffer)) > 0)
+ if (fileInput != null)
{
- output.write(buffer, 0, read);
+ byte[] buffer = new byte[1024];
+ response.setStatus(HttpServletResponse.SC_OK);
+ int read = 0;
+
+ while ((read = fileInput.read(buffer)) > 0)
+ {
+ output.write(buffer, 0, read);
+ }
+ }
+ else
+ {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND, "unknown file: " + _filename);
}
- }
- else
- {
- response.sendError(HttpServletResponse.SC_NOT_FOUND, "unknown file: "+ _filename);
}
}
}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
index 618aaed319..3eab80dbd8 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/FileServlet.java
@@ -22,17 +22,19 @@ package org.apache.qpid.server.management.plugin.servlet;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.qpid.server.management.plugin.HttpManagementUtil;
+
public class FileServlet extends HttpServlet
{
private static final String RESOURCES_PREFIX = "/resources";
@@ -97,7 +99,7 @@ public class FileServlet extends HttpServlet
{
byte[] buffer = new byte[1024];
int read = 0;
- ServletOutputStream output = response.getOutputStream();
+ OutputStream output = HttpManagementUtil.getOutputStream(request, response);
try
{
while((read = fileInput.read(buffer)) != -1)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
index a9e80db3bf..c05814bb9c 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
@@ -21,7 +21,8 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.OutputStream;
+import java.io.Writer;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
@@ -32,16 +33,18 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+
import org.apache.log4j.Logger;
-import org.apache.qpid.server.management.plugin.HttpManagementConfiguration;
-import org.apache.qpid.server.management.plugin.HttpManagementUtil;
-import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
+import org.apache.qpid.server.management.plugin.HttpManagementConfiguration;
+import org.apache.qpid.server.management.plugin.HttpManagementUtil;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
+
public abstract class AbstractServlet extends HttpServlet
{
private static final Logger LOGGER = Logger.getLogger(AbstractServlet.class);
@@ -137,6 +140,18 @@ public abstract class AbstractServlet extends HttpServlet
);
}
+ public Writer getOutputWriter(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return HttpManagementUtil.getOutputWriter(request, response, _managementConfiguration);
+ }
+
+ public OutputStream getOutputStream(final HttpServletRequest request, final HttpServletResponse response)
+ throws IOException
+ {
+ return HttpManagementUtil.getOutputStream(request, response, _managementConfiguration);
+ }
+
/**
* Performs the PUT action as the logged-in {@link Subject}.
* Subclasses commonly override this method
@@ -247,7 +262,7 @@ public abstract class AbstractServlet extends HttpServlet
}
}
- protected void sendJsonResponse(Object object, HttpServletResponse response) throws IOException,
+ protected void sendJsonResponse(Object object, HttpServletRequest request, HttpServletResponse response) throws IOException,
JsonGenerationException, JsonMappingException
{
response.setStatus(HttpServletResponse.SC_OK);
@@ -257,7 +272,7 @@ public abstract class AbstractServlet extends HttpServlet
response.setDateHeader ("Expires", 0);
response.setContentType("application/json");
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, object);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
index 367ed5a2a9..cb41fd9203 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.management.plugin.servlet.rest;
-import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Enumeration;
@@ -31,14 +30,15 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListAccessControlProviderAttributes;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListAuthenticationProviderAttributes;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListBrokerAttribute;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListGroupProviderAttributes;
import org.apache.qpid.server.management.plugin.servlet.rest.action.ListTimeZones;
import org.apache.qpid.server.model.Broker;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
public class HelperServlet extends AbstractServlet
{
@@ -122,7 +122,7 @@ public class HelperServlet extends AbstractServlet
return;
}
response.setContentType("application/json");
- final Writer writer = new BufferedWriter(response.getWriter());
+ final Writer writer = getOutputWriter(request, response);
_mapper.writeValue(writer, output);
response.setStatus(HttpServletResponse.SC_OK);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java
index 8b88e51e9c..a7889e4890 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java
@@ -18,7 +18,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.util.Collections;
import java.util.List;
@@ -27,11 +27,12 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.LogManager;
-import org.apache.qpid.server.management.plugin.log.LogFileDetails;
-import org.apache.qpid.server.management.plugin.log.LogFileHelper;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
+import org.apache.qpid.server.management.plugin.log.LogFileDetails;
+import org.apache.qpid.server.management.plugin.log.LogFileHelper;
+
public class LogFileListingServlet extends AbstractServlet
{
private static final long serialVersionUID = 1L;
@@ -56,7 +57,7 @@ public class LogFileListingServlet extends AbstractServlet
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_OK);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, logFiles);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
index 35523ddf0f..b9d58c8868 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
@@ -17,18 +17,21 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.qpid.server.logging.LogRecorder;
+
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
+import org.apache.qpid.server.logging.LogRecorder;
+
public class LogRecordsServlet extends AbstractServlet
{
private static final long serialVersionUID = 2L;
@@ -77,7 +80,7 @@ public class LogRecordsServlet extends AbstractServlet
}
}
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request,response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, logRecords);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java
index 29cc881be7..25d109ba29 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LoggedOnUserPreferencesServlet.java
@@ -33,11 +33,12 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.codehaus.jackson.map.ObjectMapper;
+
import org.apache.qpid.server.management.plugin.HttpManagementUtil;
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.PreferencesProvider;
import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
-import org.codehaus.jackson.map.ObjectMapper;
public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
@@ -59,7 +60,7 @@ public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
preferences = Collections.<String, Object>emptyMap();
}
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
/*
@@ -88,7 +89,7 @@ public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
preferences = Collections.<String, Object>emptyMap();
}
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
/*
@@ -115,7 +116,7 @@ public class LoggedOnUserPreferencesServlet extends AbstractServlet
{
preferences = Collections.<String, Object>emptyMap();
}
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
private String getAuthenticatedUserName(HttpServletRequest request)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
index ef33a240a9..db58e49eeb 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
@@ -60,7 +60,7 @@ public class MessageContentServlet extends AbstractServlet
{
response.setContentType(finder.getMimeType());
response.setContentLength((int) finder.getSize());
- response.getOutputStream().write(finder.getContent());
+ getOutputStream(request, response).write(finder.getContent());
}
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
index 8c77876e1a..8de74d189b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
@@ -18,7 +18,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -85,7 +85,7 @@ public class MessageServlet extends AbstractServlet
response.setDateHeader ("Expires", 0);
response.setContentType("application/json");
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request,response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, messageFinder.getMessageObject());
@@ -119,7 +119,7 @@ public class MessageServlet extends AbstractServlet
response.setHeader("Pragma","no-cache");
response.setDateHeader ("Expires", 0);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request,response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, messages);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
index 55c2bf6901..c84eb3200b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
@@ -20,7 +20,6 @@
*/
package org.apache.qpid.server.management.plugin.servlet.rest;
-import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
@@ -69,7 +68,7 @@ public class MetaDataServlet extends AbstractServlet
classToDataMap.put(clazz.getSimpleName(), processCategory(clazz));
}
- final Writer writer = new BufferedWriter(response.getWriter());
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, classToDataMap);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
index 57b3df8050..d96802cc8b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
@@ -16,7 +16,6 @@
*/
package org.apache.qpid.server.management.plugin.servlet.rest;
-import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Writer;
import java.security.AccessControlException;
@@ -327,7 +326,7 @@ public class RestServlet extends AbstractServlet
depth, actuals, includeSystemContext));
}
- final Writer writer = new BufferedWriter(response.getWriter());
+ Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, output);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
index 81d67caf96..3dcd4a3978 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/SaslServlet.java
@@ -21,7 +21,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.net.SocketAddress;
import java.security.Principal;
import java.security.SecureRandom;
@@ -100,7 +100,7 @@ public class SaslServlet extends AbstractServlet
outputObject.put("mechanisms", (Object) mechanisms);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
@@ -268,7 +268,7 @@ public class SaslServlet extends AbstractServlet
Map<String, Object> outputObject = new LinkedHashMap<String, Object>();
outputObject.put("challenge", new String(Base64.encodeBase64(challenge)));
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
@@ -290,7 +290,7 @@ public class SaslServlet extends AbstractServlet
outputObject.put("id", id);
outputObject.put("challenge", new String(Base64.encodeBase64(challenge)));
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
index 907610c8d2..7508aa2d0b 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/StructureServlet.java
@@ -17,7 +17,7 @@
package org.apache.qpid.server.management.plugin.servlet.rest;
import java.io.IOException;
-import java.io.PrintWriter;
+import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
@@ -55,7 +55,7 @@ public class StructureServlet extends AbstractServlet
Map<String,Object> structure = generateStructure(getBroker(), Broker.class);
- final PrintWriter writer = response.getWriter();
+ final Writer writer = getOutputWriter(request, response);
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.writeValue(writer, structure);
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
index 01657b131d..b782022986 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
+++ b/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/UserPreferencesServlet.java
@@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
+
import org.apache.qpid.server.model.AuthenticationProvider;
import org.apache.qpid.server.model.Broker;
import org.apache.qpid.server.model.PreferencesProvider;
@@ -53,15 +54,15 @@ public class UserPreferencesServlet extends AbstractServlet
String[] pathElements = getPathInfoElements(request);
if (pathElements != null && pathElements.length > 1)
{
- getUserPreferences(pathElements[0], pathElements[1], response);
+ getUserPreferences(pathElements[0], pathElements[1], request, response);
}
else
{
- getUserList(pathElements, response);
+ getUserList(pathElements, request, response);
}
}
- private void getUserPreferences(String authenticationProviderName, String userId, HttpServletResponse response)
+ private void getUserPreferences(String authenticationProviderName, String userId, HttpServletRequest request, HttpServletResponse response)
throws IOException
{
try
@@ -83,10 +84,10 @@ public class UserPreferencesServlet extends AbstractServlet
}
preferences = preferencesProvider.getPreferences(userId);
- sendJsonResponse(preferences, response);
+ sendJsonResponse(preferences, request, response);
}
- private void getUserList(String[] pathElements, HttpServletResponse response) throws IOException
+ private void getUserList(String[] pathElements, HttpServletRequest request, HttpServletResponse response) throws IOException
{
List<Map<String, Object>> users = null;
try
@@ -98,7 +99,7 @@ public class UserPreferencesServlet extends AbstractServlet
LOGGER.debug("Bad preferences request", e);
response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
}
- sendJsonResponse(users, response);
+ sendJsonResponse(users, request, response);
}
private PreferencesProvider getPreferencesProvider(String authenticationProviderName)
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
index 8cc3e76b58..51a6c761f1 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
@@ -349,10 +349,14 @@ define(["dojo/_base/xhr",
gotoButton: true,
maxPageStep: 4,
position: "bottom"
- },
- indirectSelection: true
+ }
}};
+ function isActiveVH(item)
+ {
+ return item && item.virtualhosts && item.virtualhosts[0].state=="ACTIVE";
+ }
+
that.vhostsGrid =
new UpdatableStore(that.brokerData.virtualhostnodes, query(".broker-virtualhosts")[0],
[
@@ -373,20 +377,27 @@ define(["dojo/_base/xhr",
formatter: function(item){
return item && item.virtualhosts? item.virtualhosts[0].type: "N/A";
}
- },
- { name: "Connections", field: "_item", width: "10%",
+ },
+ { name: "Connections", field: "_item", width: "8%",
formatter: function(item){
- return item && item.virtualhosts? item.virtualhosts[0].statistics.connectionCount: 0;
+ return isActiveVH(item)? item.virtualhosts[0].statistics.connectionCount: "N/A";
}
},
- { name: "Queues", field: "_item", width: "10%",
+ { name: "Queues", field: "_item", width: "8%",
formatter: function(item){
- return item && item.virtualhosts? item.virtualhosts[0].statistics.queueCount: 0;
+ return isActiveVH(item)? item.virtualhosts[0].statistics.queueCount: "N/A";
}
},
- { name: "Exchanges", field: "_item", width: "10%",
+ { name: "Exchanges", field: "_item", width: "8%",
formatter: function(item){
- return item && item.virtualhosts? item.virtualhosts[0].statistics.exchangeCount: 0;
+ return isActiveVH(item)? item.virtualhosts[0].statistics.exchangeCount: "N/A";
+ }
+ },
+ {
+ name: "Default", field: "_item", width: "6%",
+ formatter: function(item){
+ var val = item && item.virtualhosts? item.virtualhosts[0].name: null;
+ return "<input type='radio' disabled='disabled' "+(val == that.brokerData.defaultVirtualHost ? "checked='checked'": "")+" />";
}
}
], function(obj) {
@@ -424,6 +435,7 @@ define(["dojo/_base/xhr",
if (data.length == 1)
{
that.showVirtualHost(data[0], brokerObj);
+ that.vhostsGrid.grid.selection.clear();
}
});
@@ -434,6 +446,7 @@ define(["dojo/_base/xhr",
{
var item = data[0];
that.controller.show("virtualhostnode", item.name, brokerObj, item.id);
+ that.vhostsGrid.grid.selection.clear();
}
}
);
@@ -457,6 +470,7 @@ define(["dojo/_base/xhr",
var item = data[0];
util.sendRequest("api/latest/virtualhostnode/" + encodeURIComponent(item.name),
"PUT", {desiredState: "ACTIVE"});
+ that.vhostsGrid.grid.selection.clear();
}
});
@@ -473,6 +487,7 @@ define(["dojo/_base/xhr",
{
util.sendRequest("api/latest/virtualhostnode/" + encodeURIComponent(item.name),
"PUT", {desiredState: "STOPPED"});
+ that.vhostsGrid.grid.selection.clear();
}
}
});
@@ -486,6 +501,7 @@ define(["dojo/_base/xhr",
var host = item.virtualhosts[0];
util.sendRequest("api/latest/virtualhost/" + encodeURIComponent(item.name) + "/" + encodeURIComponent(host.name),
"PUT", {desiredState: "ACTIVE"});
+ that.vhostsGrid.grid.selection.clear();
}
});
@@ -501,11 +517,12 @@ define(["dojo/_base/xhr",
{
util.sendRequest("api/latest/virtualhost/" + encodeURIComponent(item.name) + "/" + encodeURIComponent(host.name),
"PUT", {desiredState: "STOPPED"});
+ that.vhostsGrid.grid.selection.clear();
}
}
});
-
- gridProperties.selectionMode="extended";
+ gridProperties.selectionMode = "extended";
+ gridProperties.plugins.indirectSelection = true;
that.portsGrid =
new UpdatableStore(that.brokerData.ports, query(".broker-ports")[0],
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js
index efe6f4eeff..07c5c25171 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/plugin/managementhttp.js
@@ -123,7 +123,16 @@ define(["dojo/_base/xhr",
name: "sessionTimeout"
});
}
+ }, {
+ name: "compressResponses",
+ createWidget: function(plugin) {
+ return new dijit.form.CheckBox({
+ required: false,
+ checked: plugin.compressResponses,
+ label: "Compress responses:",
+ name: "compressResponses"});
}
+ }
];
var data = this.managementHttpUpdater.pluginData;
util.showSetAttributesDialog(
@@ -143,6 +152,8 @@ define(["dojo/_base/xhr",
this.sessionTimeout = query(".sessionTimeout", node)[0];
this.httpsSaslAuthenticationEnabled = query(".httpsSaslAuthenticationEnabled", node)[0];
this.httpSaslAuthenticationEnabled = query(".httpSaslAuthenticationEnabled", node)[0];
+ this.compressResponses = query(".compressResponses", node)[0];
+
}
ManagementHttpUpdater.prototype.update = function(syncRequest)
@@ -161,6 +172,7 @@ define(["dojo/_base/xhr",
that.httpsBasicAuthenticationEnabled.innerHTML = showBoolean(that.pluginData.httpsBasicAuthenticationEnabled);
that.httpsSaslAuthenticationEnabled.innerHTML = showBoolean(that.pluginData.httpsSaslAuthenticationEnabled);
that.httpSaslAuthenticationEnabled.innerHTML = showBoolean(that.pluginData.httpSaslAuthenticationEnabled);
+ that.compressResponses.innerHTML = showBoolean(that.pluginData.compressResponses);
that.sessionTimeout.innerHTML = that.pluginData.sessionTimeout;
});
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html
index e91120e43b..b12869981d 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/plugin/showManagementHttp.html
@@ -40,6 +40,10 @@
<div class="formLabel-labelCell">Session timeout (s):</div>
<div class="sessionTimeout"></div>
</div>
+ <div class="clear">
+ <div class="formLabel-labelCell">Compress content:</div>
+ <div class="compressResponses"></div>
+ </div>
</div>
<br/>
<div class="dijitDialogPaneActionBar">
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/add.html
index 7cf789e520..88ca0b3807 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/add.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/add.html
@@ -19,15 +19,13 @@
<div>
<div class="clear">
- <div class="formLabel-labelCell tableContainer-labelCell">Message store path*:</div>
+ <div class="formLabel-labelCell tableContainer-labelCell">Message store path:</div>
<div class="formLabel-controlCell tableContainer-valueCell">
<input type="text" id="addVirtualHost.storePath"
data-dojo-type="dijit/form/ValidationTextBox"
data-dojo-props="
name: 'storePath',
placeHolder: 'path/to/store',
- required: true,
- missingMessage: 'Store path must be supplied',
title: 'Enter message store path'" />
</div>
</div>
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/edit.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/edit.html
index 9e240a83c4..60b8faef56 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/edit.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhost/sizemonitoring/edit.html
@@ -20,15 +20,13 @@
<div>
<div class="clear">
- <div class="formLabel-labelCell tableContainer-labelCell">Message store path*:</div>
+ <div class="formLabel-labelCell tableContainer-labelCell">Message store path:</div>
<div class="formLabel-controlCell tableContainer-valueCell">
<input type="text" id="editVirtualHost.storePath"
data-dojo-type="dijit/form/ValidationTextBox"
data-dojo-props="
name: 'storePath',
placeHolder: 'path/to/store',
- required: true,
- missingMessage: 'Store path must be supplied',
disabled: true,
title: 'Enter message store path'" />
</div>
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/filebased/edit.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/filebased/edit.html
index a132444268..2f0d72fe9a 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/filebased/edit.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/filebased/edit.html
@@ -20,15 +20,13 @@
<div>
<div class="clear">
- <div class="formLabel-labelCell tableContainer-labelCell">Configuration store path*:</div>
+ <div class="formLabel-labelCell tableContainer-labelCell">Configuration store path:</div>
<div class="formLabel-controlCell tableContainer-valueCell">
<input type="text" id="editVirtualHostNode.storePath"
data-dojo-type="dijit/form/ValidationTextBox"
data-dojo-props="
name: 'storePath',
placeHolder: 'path/to/store',
- required: true,
- missingMessage: 'Store path must be supplied',
title: 'Enter configuration store path'" />
</div>
</div>
diff --git a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/json/add.html b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/json/add.html
index 622eb17b63..ec3ef79fa0 100644
--- a/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/json/add.html
+++ b/qpid/java/broker-plugins/management-http/src/main/java/resources/virtualhostnode/json/add.html
@@ -20,15 +20,13 @@
-->
<div>
<div class="clear">
- <div class="formLabel-labelCell tableContainer-labelCell">Store path*:</div>
+ <div class="formLabel-labelCell tableContainer-labelCell">Store path:</div>
<div class="formLabel-controlCell tableContainer-valueCell">
<input type="text" id="addVirtualHostNode.jsonStorePath"
data-dojo-type="dijit/form/ValidationTextBox"
data-dojo-props="
name: 'storePath',
placeHolder: 'path/to/store',
- required: true,
- missingMessage: 'Store path must be supplied',
title: 'Enter store path'" />
</div>
</div>