You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2015/07/01 16:31:32 UTC

svn commit: r1688658 - in /qpid/java/trunk: broker-codegen/src/main/java/org/apache/qpid/server/model/validation/ broker-core/src/main/java/org/apache/qpid/server/logging/logback/ broker-core/src/main/java/org/apache/qpid/server/message/ broker-core/sr...

Author: rgodfrey
Date: Wed Jul  1 14:31:32 2015
New Revision: 1688658

URL: http://svn.apache.org/r1688658
Log:
QPID-6586 : Use operations mechanisms to get message info list

Added:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfo.java   (with props)
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoFacade.java   (with props)
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CustomRestHeaders.java   (with props)
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/RestContentHeader.java
      - copied, changed from r1688510, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ContentHeader.java
Removed:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ContentHeader.java
Modified:
    qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/ContentHeaderAnnotationValidator.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java

Modified: qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/ContentHeaderAnnotationValidator.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/ContentHeaderAnnotationValidator.java?rev=1688658&r1=1688657&r2=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/ContentHeaderAnnotationValidator.java (original)
+++ qpid/java/trunk/broker-codegen/src/main/java/org/apache/qpid/server/model/validation/ContentHeaderAnnotationValidator.java Wed Jul  1 14:31:32 2015
@@ -40,8 +40,8 @@ import java.util.Set;
 @SupportedAnnotationTypes(ContentHeaderAnnotationValidator.CONTENT_HEADER_CLASS_NAME)
 public class ContentHeaderAnnotationValidator extends AbstractProcessor
 {
-    public static final String CONTENT_HEADER_CLASS_NAME = "org.apache.qpid.server.model.ContentHeader";
-    public static final String CONTENT_CLASS_NAME = "org.apache.qpid.server.model.Content";
+    public static final String CONTENT_HEADER_CLASS_NAME = "org.apache.qpid.server.model.RestContentHeader";
+    public static final String CONTENT_CLASS_NAME = "org.apache.qpid.server.model.CustomRestHeaders";
     private static final Set<TypeKind> VALID_PRIMITIVE_TYPES = new HashSet<>(Arrays.asList(
             TypeKind.BOOLEAN,
             TypeKind.BYTE,

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java?rev=1688658&r1=1688657&r2=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java Wed Jul  1 14:31:32 2015
@@ -26,10 +26,11 @@ import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 
-import org.apache.qpid.server.model.ContentHeader;
+import org.apache.qpid.server.model.CustomRestHeaders;
+import org.apache.qpid.server.model.RestContentHeader;
 import org.apache.qpid.server.model.Content;
 
-public class PathTypedContent implements Content
+public class PathTypedContent implements Content, CustomRestHeaders
 {
     private final Path _path;
     private final String _contentType;
@@ -44,19 +45,19 @@ public class PathTypedContent implements
         _contentSize = _path == null ? 0 : _path.toFile().length();
     }
 
-    @ContentHeader("Content-Type")
+    @RestContentHeader("Content-Type")
     public String getContentType()
     {
         return _contentType;
     }
 
-    @ContentHeader("Content-Length")
+    @RestContentHeader("Content-Length")
     public long getContentLength()
     {
         return _contentSize;
     }
 
-    @ContentHeader("Content-Disposition")
+    @RestContentHeader("Content-Disposition")
     public String getContentDisposition()
     {
         return _disposition;

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfo.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfo.java?rev=1688658&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfo.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfo.java Wed Jul  1 14:31:32 2015
@@ -0,0 +1,49 @@
+/*
+ *
+ * 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.qpid.server.message;
+
+import java.util.Map;
+
+import org.apache.qpid.server.model.ManagedAttributeValueType;
+
+@ManagedAttributeValueType
+public interface MessageInfo
+{
+    long getId();
+    long getSize();
+    int getDeliveryCount();
+    String getState();
+    String getDeliveredTo();
+    long getArrivalTime();
+    boolean isPersistent();
+    String getMessageId();
+    Long getExpirationTime();
+    String getApplicationId();
+    String getCorrelationId();
+    String getEncoding();
+    String getMimeType();
+    int getPriority();
+    String getReplyTo();
+    Long getTimestamp();
+    String getType();
+    String getUserId();
+    Map<String,Object> getHeaders();
+}

Propchange: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoFacade.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoFacade.java?rev=1688658&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoFacade.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoFacade.java Wed Jul  1 14:31:32 2015
@@ -0,0 +1,236 @@
+/*
+ *
+ * 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.qpid.server.message;
+
+import java.util.AbstractMap;
+import java.util.AbstractSet;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.qpid.server.consumer.ConsumerImpl;
+
+public class MessageInfoFacade implements MessageInfo
+{
+    private final MessageInstance _instance;
+    private final boolean _includeHeaders;
+
+    public MessageInfoFacade(final MessageInstance instance, final boolean includeHeaders)
+    {
+        _instance = instance;
+        _includeHeaders = includeHeaders;
+    }
+
+
+    @Override
+    public long getId()
+    {
+        return _instance.getMessage().getMessageNumber();
+    }
+
+    @Override
+    public long getSize()
+    {
+        return _instance.getMessage().getSize();
+    }
+
+    @Override
+    public int getDeliveryCount()
+    {
+        return _instance.getDeliveryCount();
+    }
+
+    @Override
+    public String getState()
+    {
+        return _instance.isAvailable()
+                ? "Available"
+                : _instance.isAcquired()
+                        ? "Acquired"
+                        : "";
+    }
+
+    @Override
+    public String getDeliveredTo()
+    {
+        final ConsumerImpl deliveredConsumer = _instance.getDeliveredConsumer();
+        return deliveredConsumer == null ? null : String.valueOf(deliveredConsumer.getConsumerNumber());
+    }
+
+    @Override
+    public long getArrivalTime()
+    {
+        return _instance.getMessage().getArrivalTime();
+    }
+
+    @Override
+    public boolean isPersistent()
+    {
+        return _instance.getMessage().isPersistent();
+    }
+
+    @Override
+    public String getMessageId()
+    {
+        return _instance.getMessage().getMessageHeader().getMessageId();
+    }
+
+    @Override
+    public Long getExpirationTime()
+    {
+        long expiration = _instance.getMessage().getMessageHeader().getExpiration();
+        return expiration == 0l ? null : expiration;
+    }
+
+    @Override
+    public String getApplicationId()
+    {
+        return _instance.getMessage().getMessageHeader().getAppId();
+    }
+
+    @Override
+    public String getCorrelationId()
+    {
+        return _instance.getMessage().getMessageHeader().getCorrelationId();
+    }
+
+    @Override
+    public String getEncoding()
+    {
+        return _instance.getMessage().getMessageHeader().getEncoding();
+    }
+
+    @Override
+    public String getMimeType()
+    {
+        return _instance.getMessage().getMessageHeader().getMimeType();
+    }
+
+    @Override
+    public int getPriority()
+    {
+        return _instance.getMessage().getMessageHeader().getPriority();
+    }
+
+    @Override
+    public String getReplyTo()
+    {
+        return _instance.getMessage().getMessageHeader().getReplyTo();
+    }
+
+    @Override
+    public Long getTimestamp()
+    {
+        long timestamp = _instance.getMessage().getMessageHeader().getTimestamp();
+        return timestamp == 0l ? null : timestamp;
+    }
+
+    @Override
+    public String getType()
+    {
+        return _instance.getMessage().getMessageHeader().getType();
+    }
+
+    @Override
+    public String getUserId()
+    {
+        return _instance.getMessage().getMessageHeader().getUserId();
+    }
+
+    @Override
+    public Map<String, Object> getHeaders()
+    {
+        if(_includeHeaders)
+        {
+            final Collection<String> headerNames =
+                    _instance.getMessage().getMessageHeader().getHeaderNames();
+            return new AbstractMap<String, Object>()
+            {
+                @Override
+                public Set<Entry<String, Object>> entrySet()
+                {
+                    return new AbstractSet<Entry<String, Object>>()
+                    {
+                        @Override
+                        public Iterator<Entry<String, Object>> iterator()
+                        {
+                            final Iterator<String> nameIterator = headerNames.iterator();
+
+                            return new Iterator<Entry<String, Object>>()
+                            {
+                                @Override
+                                public boolean hasNext()
+                                {
+                                    return nameIterator.hasNext();
+                                }
+
+                                @Override
+                                public Entry<String, Object> next()
+                                {
+                                    final String headerName = nameIterator.next();
+                                    final Object value =
+                                            _instance.getMessage().getMessageHeader().getHeader(headerName);
+                                    return new Entry<String, Object>()
+                                    {
+                                        @Override
+                                        public String getKey()
+                                        {
+                                            return headerName;
+                                        }
+
+                                        @Override
+                                        public Object getValue()
+                                        {
+                                            return value;
+                                        }
+
+                                        @Override
+                                        public Object setValue(final Object value)
+                                        {
+                                            throw new UnsupportedOperationException();
+                                        }
+                                    };
+                                }
+
+                                @Override
+                                public void remove()
+                                {
+                                    nameIterator.remove();
+                                }
+                            };
+                        }
+
+                        @Override
+                        public int size()
+                        {
+                            return headerNames.size();
+                        }
+                    };
+                }
+            };
+        }
+        else
+        {
+            return null;
+        }
+    }
+}

Propchange: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/message/MessageInfoFacade.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CustomRestHeaders.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CustomRestHeaders.java?rev=1688658&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CustomRestHeaders.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CustomRestHeaders.java Wed Jul  1 14:31:32 2015
@@ -0,0 +1,25 @@
+/*
+ *
+ * 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.qpid.server.model;
+
+public interface CustomRestHeaders
+{
+}

Propchange: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/CustomRestHeaders.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java?rev=1688658&r1=1688657&r2=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Queue.java Wed Jul  1 14:31:32 2015
@@ -24,6 +24,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.qpid.server.message.MessageInfo;
 import org.apache.qpid.server.queue.QueueEntryVisitor;
 import org.apache.qpid.server.store.MessageDurability;
 
@@ -247,7 +248,11 @@ public interface Queue<X extends Queue<X
     @ManagedOperation
     long clearQueue();
 
-    @ManagedOperation
+    @ManagedOperation(nonModifying = true)
     Content getMessageContent(@Param(name = "messageId") long messageId);
 
+    @ManagedOperation(nonModifying = true)
+    List<MessageInfo> getMessageInfo(@Param(name = "first", defaultValue = "-1") int first, @Param(name = "last", defaultValue = "-1") int last);
+
+
 }

Copied: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/RestContentHeader.java (from r1688510, qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ContentHeader.java)
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/RestContentHeader.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/RestContentHeader.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ContentHeader.java&r1=1688510&r2=1688658&rev=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ContentHeader.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/RestContentHeader.java Wed Jul  1 14:31:32 2015
@@ -27,7 +27,7 @@ import java.lang.annotation.Target;
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-public @interface ContentHeader
+public @interface RestContentHeader
 {
     String value();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java?rev=1688658&r1=1688657&r2=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/queue/AbstractQueue.java Wed Jul  1 14:31:32 2015
@@ -18,9 +18,7 @@
  */
 package org.apache.qpid.server.queue;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
 import java.security.AccessControlException;
@@ -49,7 +47,11 @@ import javax.security.auth.Subject;
 
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import org.apache.qpid.server.model.ContentHeader;
+
+import org.apache.qpid.server.message.MessageInfo;
+import org.apache.qpid.server.message.MessageInfoFacade;
+import org.apache.qpid.server.model.CustomRestHeaders;
+import org.apache.qpid.server.model.RestContentHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -2528,7 +2530,7 @@ public abstract class AbstractQueue<X ex
         }
     }
 
-    public static class MessageContent implements Content
+    public static class MessageContent implements Content, CustomRestHeaders
     {
         private final byte[] _data;
         private final String _mimeType;
@@ -2545,13 +2547,13 @@ public abstract class AbstractQueue<X ex
             outputStream.write(_data);
         }
 
-        @ContentHeader("Content-Type")
+        @RestContentHeader("Content-Type")
         public String getContentType()
         {
             return _mimeType;
         }
 
-        @ContentHeader("Content-Length")
+        @RestContentHeader("Content-Length")
         public long getSize()
         {
             return _data.length;
@@ -3302,6 +3304,14 @@ public abstract class AbstractQueue<X ex
         }
     }
 
+    public List<MessageInfo> getMessageInfo(int first, int last)
+    {
+        final MessageCollector messageCollector = new MessageCollector(first, last, false);
+        visit(messageCollector);
+        return messageCollector.getMessages();
+
+    }
+
     private void authorizeMethod(String methodName)
     {
         getSecurityManager().authoriseMethod(Operation.UPDATE,
@@ -3379,4 +3389,52 @@ public abstract class AbstractQueue<X ex
             return _found;
         }
     }
+
+    private class MessageCollector implements QueueEntryVisitor
+    {
+
+
+
+        private class MessageRangeList extends ArrayList<MessageInfo> implements CustomRestHeaders
+        {
+            @RestContentHeader("Content-Range")
+            public String getContentRange()
+            {
+                String min = isEmpty() ? "0" : String.valueOf(_first);
+                String max = isEmpty() ? "0" : String.valueOf(_first + size() - 1);
+                return "" + min + "-" + max + "/" + getQueueDepthMessages();
+            }
+        }
+
+        private final int _first;
+        private final int _last;
+        private int _position = -1;
+        private final List<MessageInfo> _messages = new MessageRangeList();
+        private final boolean _includeHeaders;
+
+        private MessageCollector(int first, int last, boolean includeHeaders)
+        {
+            _first = first;
+            _last = last;
+            _includeHeaders = includeHeaders;
+        }
+
+
+        public boolean visit(QueueEntry entry)
+        {
+
+            _position++;
+            if((_first == -1 || _position >= _first) && (_last == -1 || _position <= _last))
+            {
+                _messages.add(new MessageInfoFacade(entry, _includeHeaders));
+            }
+            return _last != -1 && _position > _last;
+        }
+
+        public List<MessageInfo> getMessages()
+        {
+            return _messages;
+        }
+    }
+
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java?rev=1688658&r1=1688657&r2=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/AutoGeneratedSelfSignedKeyStoreImpl.java Wed Jul  1 14:31:32 2015
@@ -299,7 +299,6 @@ public class AutoGeneratedSelfSignedKeyS
                     dnsNames.add(canonicalHostName);
                 }
             }
-            System.err.println(dnsNames);
             for(String dnsName : dnsNames)
             {
                 if(dnsName.matches("[\\w&&[^\\d]][\\w\\d.-]*"))

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java?rev=1688658&r1=1688657&r2=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java Wed Jul  1 14:31:32 2015
@@ -42,7 +42,8 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.qpid.server.model.Content;
-import org.apache.qpid.server.model.ContentHeader;
+import org.apache.qpid.server.model.CustomRestHeaders;
+import org.apache.qpid.server.model.RestContentHeader;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.map.SerializationConfig;
 import org.slf4j.Logger;
@@ -259,7 +260,7 @@ public abstract class AbstractServlet ex
         sendJsonResponse(object, request, response, HttpServletResponse.SC_OK, true);
     }
 
-    protected void sendJsonResponse(Object object, HttpServletRequest request, HttpServletResponse response, int responseCode, boolean sendCachingHeaders) throws IOException
+    protected final void sendJsonResponse(Object object, HttpServletRequest request, HttpServletResponse response, int responseCode, boolean sendCachingHeaders) throws IOException
     {
         response.setStatus(responseCode);
         response.setContentType("application/json");
@@ -270,19 +271,20 @@ public abstract class AbstractServlet ex
             sendCachingHeadersOnResponse(response);
         }
 
+
+        if(object instanceof CustomRestHeaders)
+        {
+            setResponseHeaders(response, (CustomRestHeaders) object);
+        }
         writeObjectToResponse(object, request, response);
     }
 
-    protected void sendJsonErrorResponse(HttpServletRequest request,
-                                         HttpServletResponse response,
-                                         int responseCode,
-                                         String message) throws IOException
+    protected final void sendJsonErrorResponse(HttpServletRequest request,
+                                               HttpServletResponse response,
+                                               int responseCode,
+                                               String message) throws IOException
     {
-        response.setStatus(responseCode);
-        response.setContentType("application/json");
-        response.setCharacterEncoding(StandardCharsets.UTF_8.name());
-
-        writeObjectToResponse(Collections.singletonMap("errorMessage", message), request, response);
+        sendJsonResponse(Collections.singletonMap("errorMessage", message), request, response, responseCode, false);
     }
 
     protected void sendError(final HttpServletResponse resp, int responseCode)
@@ -337,15 +339,34 @@ public abstract class AbstractServlet ex
 
     protected void writeTypedContent(Content content, HttpServletRequest request, HttpServletResponse response) throws IOException
     {
-        Map<ContentHeader, Method> contentHeaderGetters = getContentHeaderMethods(content);
+        try(OutputStream os = getOutputStream(request, response))
+        {
+            if(content instanceof CustomRestHeaders)
+            {
+                setResponseHeaders(response, (CustomRestHeaders) content);
+            }
+            response.setStatus(HttpServletResponse.SC_OK);
+            content.write(os);
+
+        }
+        catch(IOException e)
+        {
+            LOGGER.warn("Unexpected exception processing request", e);
+            sendJsonErrorResponse(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+        }
+    }
+
+    private void setResponseHeaders(final HttpServletResponse response, final CustomRestHeaders customRestHeaders)
+    {
+        Map<RestContentHeader, Method> contentHeaderGetters = getContentHeaderMethods(customRestHeaders);
         if (contentHeaderGetters != null)
         {
-            for (Map.Entry<ContentHeader, Method> entry: contentHeaderGetters.entrySet())
+            for (Map.Entry<RestContentHeader, Method> entry : contentHeaderGetters.entrySet())
             {
                 final String headerName = entry.getKey().value();
                 try
                 {
-                    response.setHeader(headerName, String.valueOf(entry.getValue().invoke(content)));
+                    response.setHeader(headerName, String.valueOf(entry.getValue().invoke(customRestHeaders)));
                 }
                 catch (Exception e)
                 {
@@ -354,29 +375,15 @@ public abstract class AbstractServlet ex
             }
 
         }
-        try(OutputStream os = getOutputStream(request, response))
-        {
-            content.write(os);
-            response.setStatus(HttpServletResponse.SC_OK);
-        }
-        catch (FileNotFoundException e)
-        {
-            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-        }
-        catch(IOException e)
-        {
-            LOGGER.warn("Unexpected exception processing request", e);
-            sendJsonErrorResponse(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
-        }
     }
 
-    private Map<ContentHeader, Method> getContentHeaderMethods(Content content)
+    private Map<RestContentHeader, Method> getContentHeaderMethods(CustomRestHeaders content)
     {
-        Map<ContentHeader, Method> results = new HashMap<>();
+        Map<RestContentHeader, Method> results = new HashMap<>();
         Method[] methods = content.getClass().getMethods();
         for (Method method: methods)
         {
-            if (method.isAnnotationPresent(ContentHeader.class))
+            if (method.isAnnotationPresent(RestContentHeader.class))
             {
                 final Class<?>[] parameterTypes = method.getParameterTypes();
                 if (parameterTypes.length >0)
@@ -386,7 +393,8 @@ public abstract class AbstractServlet ex
                 }
                 else
                 {
-                    results.put(method.getAnnotation(ContentHeader.class), method);
+                    method.setAccessible(true);
+                    results.put(method.getAnnotation(RestContentHeader.class), method);
                 }
             }
         }

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java?rev=1688658&r1=1688657&r2=1688658&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java Wed Jul  1 14:31:32 2015
@@ -279,6 +279,7 @@ public class MessageServlet extends Abst
 
     }
 
+
     private void addIfPresentAndNotZero(Map<String, Object> object, String name, Object property)
     {
         if(property instanceof Number)



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org