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/06/12 23:23:39 UTC

svn commit: r1685175 - in /qpid/java/trunk: broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/main/java/org/apache/qpid/server/queue/ broker-core/src/main/java/org/apache/qpid/server/util/ broker-core/src/test/java/org/apache/qpid...

Author: rgodfrey
Date: Fri Jun 12 21:23:38 2015
New Revision: 1685175

URL: http://svn.apache.org/r1685175
Log:
QPID-6586 : [Java Broker] Add unit tests, special case TypedContent where the content-type needs to be set, improved error messages

Added:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/TypedContent.java   (with props)
Removed:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ResourceBundleLoader.java
Modified:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.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/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCar.java
    qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCarImpl.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageServlet.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java Fri Jun 12 21:23:38 2015
@@ -201,7 +201,7 @@ abstract class AttributeValueConverter<T
                 }
                 catch(NumberFormatException e)
                 {
-                    throw new IllegalArgumentException("Cannot convert string '" + interpolated + "'",e);
+                    throw new IllegalArgumentException("Cannot convert string '" + interpolated + "' to a long integer",e);
                 }
             }
             else if(value == null)
@@ -237,7 +237,7 @@ abstract class AttributeValueConverter<T
                 }
                 catch(NumberFormatException e)
                 {
-                    throw new IllegalArgumentException("Cannot convert string '" + interpolated + "'",e);
+                    throw new IllegalArgumentException("Cannot convert string '" + interpolated + "' to an integer",e);
                 }
             }
             else if(value == null)
@@ -273,7 +273,7 @@ abstract class AttributeValueConverter<T
                 }
                 catch(NumberFormatException e)
                 {
-                    throw new IllegalArgumentException("Cannot convert string '" + interpolated + "'",e);
+                    throw new IllegalArgumentException("Cannot convert string '" + interpolated + "' to a short integer",e);
                 }
             }
             else if(value == null)
@@ -552,7 +552,11 @@ abstract class AttributeValueConverter<T
 
     static Class<?> getTypeFromMethod(final Method m)
     {
-        Class<?> type = m.getReturnType();
+        return convertPrimitiveToBoxed(m.getReturnType());
+    }
+
+    static Class<?> convertPrimitiveToBoxed(Class<?> type)
+    {
         if(type.isPrimitive())
         {
             if(type == Boolean.TYPE)

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectOperation.java Fri Jun 12 21:23:38 2015
@@ -38,11 +38,16 @@ public class ConfiguredObjectOperation<C
     private final Method _operation;
     private final OperationParameter[] _params;
     private final Set<String> _validNames;
+    private final String _objectType;
+    private final ConfiguredObjectTypeRegistry _typeRegistry;
 
     public ConfiguredObjectOperation(Class<C> clazz,
-                                     final Method operation)
+                                     final Method operation,
+                                     final ConfiguredObjectTypeRegistry typeRegistry)
     {
+        _objectType = clazz.getSimpleName();
         _operation = operation;
+        _typeRegistry = typeRegistry;
         final Annotation[][] allParameterAnnotations = _operation.getParameterAnnotations();
         _params = new OperationParameter[allParameterAnnotations.length];
         Set<String> validNames = new LinkedHashSet<>();
@@ -78,57 +83,95 @@ public class ConfiguredObjectOperation<C
 
     public Object perform(C subject, Map<String, Object> parameters)
     {
-        Set<String> providedNames = new HashSet<>(parameters.keySet());
-        providedNames.removeAll(_validNames);
-        if(!providedNames.isEmpty())
+        final Map<String, ConfiguredObjectOperation<?>> operationsOnSubject =
+                _typeRegistry.getOperations(subject.getClass());
+
+        if(operationsOnSubject == null || operationsOnSubject.get(_operation.getName()) == null)
         {
-            throw new IllegalArgumentException("Parameters " + providedNames + " are not accepted by " + getName());
+            throw new IllegalArgumentException("No operation " + _operation.getName() + " on " + subject.getClass().getSimpleName());
         }
-        Object[] paramValues = new Object[_params.length];
-        for(int i = 0; i <_params.length; i++)
+        else if(!hasSameParameters(operationsOnSubject.get(_operation.getName())))
         {
-            OperationParameter param = _params[i];
-            Object providedVal;
-            if(parameters.containsKey(param.getName()))
-            {
-                providedVal = parameters.get(param.getName());
-            }
-            else if(!"".equals(param.getDefaultValue()))
-            {
-                providedVal = param.getDefaultValue();
-            }
-            else
-            {
-                providedVal = null;
-            }
-            final AttributeValueConverter<?> converter =
-                    AttributeValueConverter.getConverter(param.getType(),
-                                                         param.getGenericType());
-            final Object convertedVal = converter.convert(providedVal, subject);
-            paramValues[i] = convertedVal;
+            throw new IllegalArgumentException("Operation "
+                                               + _operation.getName()
+                                               + " on "
+                                               + _objectType
+                                               + " cannot be used on an object of type "
+                                               + subject.getClass().getSimpleName());
         }
-        try
+        else if(operationsOnSubject.get(_operation.getName()) != this)
         {
-            return _operation.invoke(subject, paramValues);
+            return ((ConfiguredObjectOperation<C>)operationsOnSubject.get(_operation.getName())).perform(subject, parameters);
         }
-        catch (IllegalAccessException e)
+        else
         {
-            throw new ServerScopedRuntimeException(e);
-        }
-        catch (InvocationTargetException e)
-        {
-            if(e.getCause() instanceof RuntimeException)
-            {
-                throw (RuntimeException) e.getCause();
+
+            Set<String> providedNames = new HashSet<>(parameters.keySet());
+            providedNames.removeAll(_validNames);
+            if (!providedNames.isEmpty())
+            {
+                throw new IllegalArgumentException("Parameters " + providedNames + " are not accepted by " + getName());
+            }
+            Object[] paramValues = new Object[_params.length];
+            for (int i = 0; i < _params.length; i++)
+            {
+                OperationParameter param = _params[i];
+                Object providedVal;
+                if (parameters.containsKey(param.getName()))
+                {
+                    providedVal = parameters.get(param.getName());
+                }
+                else if (!"".equals(param.getDefaultValue()))
+                {
+                    providedVal = param.getDefaultValue();
+                }
+                else
+                {
+                    providedVal = null;
+                }
+                final AttributeValueConverter<?> converter =
+                        AttributeValueConverter.getConverter(AttributeValueConverter.convertPrimitiveToBoxed(param.getType()),
+                                                             param.getGenericType());
+                try
+                {
+                    final Object convertedVal = converter.convert(providedVal, subject);
+                    paramValues[i] = convertedVal;
+                }
+                catch (IllegalArgumentException e)
+                {
+                    throw new IllegalArgumentException(e.getMessage()
+                                                       + " for parameter '"
+                                                       + param.getName()
+                                                       + "' in "
+                                                       + _objectType
+                                                       + "."
+                                                       + _operation.getName()
+                                                       + "(...) operation", e.getCause());
+                }
             }
-            else if(e.getCause() instanceof Error)
+            try
             {
-                throw (Error) e.getCause();
+                return _operation.invoke(subject, paramValues);
             }
-            else
+            catch (IllegalAccessException e)
             {
                 throw new ServerScopedRuntimeException(e);
             }
+            catch (InvocationTargetException e)
+            {
+                if (e.getCause() instanceof RuntimeException)
+                {
+                    throw (RuntimeException) e.getCause();
+                }
+                else if (e.getCause() instanceof Error)
+                {
+                    throw (Error) e.getCause();
+                }
+                else
+                {
+                    throw new ServerScopedRuntimeException(e);
+                }
+            }
         }
     }
 

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java Fri Jun 12 21:23:38 2015
@@ -721,7 +721,7 @@ public class ConfiguredObjectTypeRegistr
             throw new ServerScopedRuntimeException("Can only define ManagedOperations on interfaces which extend " + ConfiguredObject.class.getSimpleName() + ". " + clazz.getSimpleName() + " does not meet these criteria.");
         }
 
-        ConfiguredObjectOperation<?> operation = new ConfiguredObjectOperation<>(clazz, m);
+        ConfiguredObjectOperation<?> operation = new ConfiguredObjectOperation<>(clazz, m, this);
         Iterator<ConfiguredObjectOperation<?>> iter = operationSet.iterator();
         while(iter.hasNext())
         {

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=1685175&r1=1685174&r2=1685175&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 Fri Jun 12 21:23:38 2015
@@ -239,7 +239,15 @@ public interface Queue<X extends Queue<X
     @ManagedOperation
     List<Long> copyMessages(@Param(name = "destination") Queue<?> destination, @Param(name = "messageIds") List<Long> messageIds);
 
+
+    @ManagedOperation
+    List<Long> deleteMessages(@Param(name = "messageIds") List<Long> messageIds);
+
+
     @ManagedOperation
     long clearQueue();
 
+    @ManagedOperation
+    TypedContent getMessageContent(@Param(name = "messageId") long messageId);
+
 }

Added: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/TypedContent.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/TypedContent.java?rev=1685175&view=auto
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/TypedContent.java (added)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/TypedContent.java Fri Jun 12 21:23:38 2015
@@ -0,0 +1,28 @@
+/*
+ *
+ * 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;
+
+@ManagedAttributeValueType
+public interface TypedContent
+{
+    String getContentType();
+    byte[] getData();
+}

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

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=1685175&r1=1685174&r2=1685175&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 Fri Jun 12 21:23:38 2015
@@ -18,6 +18,7 @@
  */
 package org.apache.qpid.server.queue;
 
+import java.nio.ByteBuffer;
 import java.security.AccessControlException;
 import java.security.AccessController;
 import java.security.Principal;
@@ -77,15 +78,19 @@ import org.apache.qpid.server.model.Exch
 import org.apache.qpid.server.model.ExclusivityPolicy;
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.ManagedAttributeField;
+import org.apache.qpid.server.model.Param;
 import org.apache.qpid.server.model.Queue;
 import org.apache.qpid.server.model.QueueNotificationListener;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.StateTransition;
+import org.apache.qpid.server.model.TypedContent;
+import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.plugin.MessageFilterFactory;
 import org.apache.qpid.server.plugin.QpidServiceLoader;
 import org.apache.qpid.server.protocol.AMQConnectionModel;
 import org.apache.qpid.server.protocol.AMQSessionModel;
 import org.apache.qpid.server.security.SecurityManager;
+import org.apache.qpid.server.security.access.Operation;
 import org.apache.qpid.server.security.auth.AuthenticatedPrincipal;
 import org.apache.qpid.server.store.MessageDurability;
 import org.apache.qpid.server.store.MessageEnqueueRecord;
@@ -3207,6 +3212,10 @@ public abstract class AbstractQueue<X ex
     @Override
     public List<Long> moveMessages(Queue<?> destination, List<Long> messageIds)
     {
+        // FIXME: added temporary authorization check until we introduce management layer
+        // and review current ACL rules to have common rules for all management interfaces
+        authorizeMethod("moveMessages");
+
         List<Long> copy = new ArrayList<>(messageIds);
         _virtualHost.executeTransaction(new MoveMessagesTransaction(this, copy, destination));
         List<Long> returnVal = new ArrayList<>(messageIds);
@@ -3218,6 +3227,10 @@ public abstract class AbstractQueue<X ex
     @Override
     public List<Long> copyMessages(Queue<?> destination, List<Long> messageIds)
     {
+        // FIXME: added temporary authorization check until we introduce management layer
+        // and review current ACL rules to have common rules for all management interfaces
+        authorizeMethod("copyMessages");
+
         List<Long> copy = new ArrayList<>(messageIds);
         _virtualHost.executeTransaction(new CopyMessagesTransaction(this, copy, destination));
         List<Long> returnVal = new ArrayList<>(messageIds);
@@ -3226,4 +3239,124 @@ public abstract class AbstractQueue<X ex
 
     }
 
+    @Override
+    public List<Long> deleteMessages(final List<Long> messageIds)
+    {
+
+        // FIXME: added temporary authorization check until we introduce management layer
+        // and review current ACL rules to have common rules for all management interfaces
+        authorizeMethod("deleteMessages");
+
+        List<Long> copy = new ArrayList<>(messageIds);
+        _virtualHost.executeTransaction(new DeleteMessagesTransaction(this, copy));
+        List<Long> returnVal = new ArrayList<>(messageIds);
+        returnVal.removeAll(copy);
+        return returnVal;
+    }
+
+    @Override
+    public TypedContent getMessageContent(final long messageId)
+    {
+        final MessageFinder messageFinder = new MessageFinder(messageId);
+        visit(messageFinder);
+        if(messageFinder.isFound())
+        {
+            return new TypedContent()
+                    {
+                        @Override
+                        public String getContentType()
+                        {
+                            return messageFinder.getMimeType();
+                        }
+
+                        @Override
+                        public byte[] getData()
+                        {
+                            return messageFinder.getContent();
+                        }
+                    };
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+    private void authorizeMethod(String methodName)
+    {
+        getSecurityManager().authoriseMethod(Operation.UPDATE,
+                                             "VirtualHost.Queue",
+                                             methodName,
+                                             getVirtualHost().getName());
+    }
+
+
+    private class MessageFinder implements QueueEntryVisitor
+    {
+        private final long _messageNumber;
+        private String _mimeType;
+        private long _size;
+        private byte[] _content;
+        private boolean _found;
+
+        private MessageFinder(long messageNumber)
+        {
+            _messageNumber = messageNumber;
+        }
+
+
+        public boolean visit(QueueEntry entry)
+        {
+            ServerMessage message = entry.getMessage();
+            if(message != null)
+            {
+                if(_messageNumber == message.getMessageNumber())
+                {
+                    try
+                    {
+                        MessageReference reference = message.newReference();
+                        try
+                        {
+                            _mimeType = message.getMessageHeader().getMimeType();
+                            _size = message.getSize();
+                            _content = new byte[(int) _size];
+                            _found = true;
+                            message.getContent(ByteBuffer.wrap(_content), 0);
+                        }
+                        finally
+                        {
+                            reference.release();
+                        }
+                        return true;
+                    }
+                    catch (MessageDeletedException e)
+                    {
+                        // ignore - the message was deleted as we tried too look at it, treat as if no message found
+                    }
+                }
+
+            }
+            return false;
+        }
+
+        public String getMimeType()
+        {
+            return _mimeType;
+        }
+
+        public long getSize()
+        {
+            return _size;
+        }
+
+        public byte[] getContent()
+        {
+            return _content;
+        }
+
+        public boolean isFound()
+        {
+            return _found;
+        }
+    }
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ConfiguredObjectTypeRegistryTest.java Fri Jun 12 21:23:38 2015
@@ -23,13 +23,18 @@ package org.apache.qpid.server.model.tes
 import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 import junit.framework.TestCase;
 
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ConfiguredObjectOperation;
 import org.apache.qpid.server.model.ConfiguredObjectTypeRegistry;
 import org.apache.qpid.server.model.ManagedInterface;
 import org.apache.qpid.test.utils.QpidTestCase;
@@ -72,4 +77,51 @@ public class ConfiguredObjectTypeRegistr
         Set<Class<? extends ManagedInterface>> stdCarIntfcs = _typeRegistry.getManagedInterfaces(TestPetrolEngine.class);
         assertThat(stdCarIntfcs.size(), is(0));
     }
+
+    public void testOperations()
+    {
+        final String objectName = "testKitCar";
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, objectName);
+        attributes.put(ConfiguredObject.TYPE, TestKitCarImpl.TEST_KITCAR_TYPE);
+
+        TestCar object = TestModel.getInstance().getObjectFactory().create(TestCar.class, attributes);
+
+        assertEquals(TestKitCarImpl.class, object.getTypeClass());
+
+        final Map<String, ConfiguredObjectOperation<?>> kitCarOperations =
+                _typeRegistry.getOperations(object.getClass());
+        assertEquals(1, kitCarOperations.size());
+        assertTrue(kitCarOperations.containsKey("openDoor"));
+        final ConfiguredObjectOperation<TestCar> operation =
+                (ConfiguredObjectOperation<TestCar>) kitCarOperations.get("openDoor");
+
+        // test explicitly setting parameter
+        Object returnVal = operation.perform(object, Collections.<String, Object>singletonMap("door", "DRIVER"));
+        assertEquals(TestCar.Door.DRIVER, returnVal);
+
+        // test default parameter
+        returnVal = operation.perform(object, Collections.<String, Object>emptyMap());
+        assertEquals(TestCar.Door.PASSENGER, returnVal);
+
+        try
+        {
+            operation.perform(object, Collections.<String, Object>singletonMap("seat", "DRIVER"));
+            fail("Should not be able to pass in an unused parameter");
+        }
+        catch(IllegalArgumentException e)
+        {
+            // pass
+        }
+
+        try
+        {
+            operation.perform(object, Collections.<String, Object>singletonMap("door", "[\"eggs\", \"flour\", \"milk\"]"));
+            fail("Should not be able to pass in a parameter of the wrong type");
+        }
+        catch(IllegalArgumentException e)
+        {
+            // pass
+        }
+    }
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestCar.java Fri Jun 12 21:23:38 2015
@@ -22,8 +22,14 @@ package org.apache.qpid.server.model.tes
 
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.ManagedOperation;
+import org.apache.qpid.server.model.Param;
 
 @ManagedObject( defaultType = TestStandardCarImpl.TEST_STANDARD_CAR_TYPE)
 public interface TestCar<X extends TestCar<X>> extends ConfiguredObject<X>
 {
+    enum Door { DRIVER, PASSENGER }
+
+    @ManagedOperation
+    Door openDoor(@Param(name = "door") Door door);
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCar.java Fri Jun 12 21:23:38 2015
@@ -19,8 +19,12 @@
 package org.apache.qpid.server.model.testmodels.hierarchy;
 
 import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.ManagedOperation;
+import org.apache.qpid.server.model.Param;
 
 @ManagedObject(category = false)
 public interface TestKitCar<X extends TestKitCar<X>> extends TestCar<X>
 {
+    @ManagedOperation
+    Door openDoor(@Param(name = "door", defaultValue = "PASSENGER") Door door);
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestKitCarImpl.java Fri Jun 12 21:23:38 2015
@@ -25,6 +25,7 @@ import org.apache.qpid.server.model.Abst
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.Param;
 import org.apache.qpid.server.model.testmodels.TestSecurityManager;
 import org.apache.qpid.server.security.SecurityManager;
 
@@ -63,4 +64,10 @@ public class TestKitCarImpl extends Abst
     {
         return _securityManager;
     }
+
+    @Override
+    public Door openDoor(final Door door)
+    {
+        return door;
+    }
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCar.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCar.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCar.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCar.java Fri Jun 12 21:23:38 2015
@@ -20,8 +20,13 @@
 package org.apache.qpid.server.model.testmodels.hierarchy;
 
 import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.model.ManagedOperation;
+import org.apache.qpid.server.model.Param;
 
 @ManagedObject(category = false)
 public interface TestStandardCar<X extends TestStandardCar<X>> extends TestCar<X>
 {
+
+    @ManagedOperation
+    Door openDoor(@Param(name = "door", defaultValue = "DRIVER") Door door);
 }

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCarImpl.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCarImpl.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCarImpl.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/TestStandardCarImpl.java Fri Jun 12 21:23:38 2015
@@ -29,6 +29,7 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.Param;
 import org.apache.qpid.server.model.testmodels.TestSecurityManager;
 import org.apache.qpid.server.security.SecurityManager;
 
@@ -67,4 +68,10 @@ public class TestStandardCarImpl extends
     {
         return _securityManager;
     }
+
+    @Override
+    public Door openDoor(final Door door)
+    {
+        return door;
+    }
 }

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.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/MessageContentServlet.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MessageContentServlet.java Fri Jun 12 21:23:38 2015
@@ -28,6 +28,7 @@ import org.apache.qpid.server.message.Me
 import org.apache.qpid.server.message.MessageReference;
 import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.Queue;
+import org.apache.qpid.server.model.TypedContent;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.queue.QueueEntry;
 import org.apache.qpid.server.queue.QueueEntryVisitor;
@@ -54,16 +55,13 @@ public class MessageContentServlet exten
     {
         Queue queue = getQueueFromRequest(request);
         String path[] = getPathInfoElements(request);
-        MessageFinder finder = new MessageFinder(Long.parseLong(path[2]));
-        queue.visit(finder);
-        if(finder.isFound())
+        TypedContent content = queue.getMessageContent(Long.parseLong(path[2]));
+        if(content != null)
         {
-            response.setContentType(finder.getMimeType());
-            response.setContentLength((int) finder.getSize());
-            getOutputStream(request, response).write(finder.getContent());
-
+            response.setContentType(content.getContentType());
+            response.setContentLength(content.getData().length);
+            getOutputStream(request, response).write(content.getData());
         }
-
     }
 
     private Queue getQueueFromRequest(HttpServletRequest request)
@@ -101,74 +99,7 @@ public class MessageContentServlet exten
         return queue;
     }
 
-    private class MessageFinder implements QueueEntryVisitor
-    {
-        private final long _messageNumber;
-        private String _mimeType;
-        private long _size;
-        private byte[] _content;
-        private boolean _found;
-
-        private MessageFinder(long messageNumber)
-        {
-            _messageNumber = messageNumber;
-        }
-
-
-        public boolean visit(QueueEntry entry)
-        {
-            ServerMessage message = entry.getMessage();
-            if(message != null)
-            {
-                if(_messageNumber == message.getMessageNumber())
-                {
-                    try
-                    {
-                        MessageReference reference = message.newReference();
-                        try
-                        {
-                            _mimeType = message.getMessageHeader().getMimeType();
-                            _size = message.getSize();
-                            _content = new byte[(int) _size];
-                            _found = true;
-                            message.getContent(ByteBuffer.wrap(_content), 0);
-                        }
-                        finally
-                        {
-                            reference.release();
-                        }
-                        return true;
-                    }
-                    catch (MessageDeletedException e)
-                    {
-                        // ignore - the message was deleted as we tried too look at it, treat as if no message found
-                    }
-                }
-
-            }
-            return false;
-        }
 
-        public String getMimeType()
-        {
-            return _mimeType;
-        }
-
-        public long getSize()
-        {
-            return _size;
-        }
-
-        public byte[] getContent()
-        {
-            return _content;
-        }
-
-        public boolean isFound()
-        {
-            return _found;
-        }
-    }
 
 
 }

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=1685175&r1=1685174&r2=1685175&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 Fri Jun 12 21:23:38 2015
@@ -359,19 +359,18 @@ public class MessageServlet extends Abst
 
             boolean isMoveTransaction = move != null && Boolean.valueOf(move);
 
-            // FIXME: added temporary authorization check until we introduce management layer
-            // and review current ACL rules to have common rules for all management interfaces
-            String methodName = isMoveTransaction? "moveMessages":"copyMessages";
-            authorizeMethod(methodName, vhost);
-
-
             final Queue destinationQueue = getQueueFromVirtualHost(destQueueName, vhost);
             final List<Long> messageIds = new ArrayList<Long>((List<Long>) providedObject.get("messages"));
-            VirtualHost.TransactionalOperation txn =
-                    isMoveTransaction
-                            ? new MoveMessagesTransaction(sourceQueue, messageIds, destinationQueue)
-                            : new CopyMessagesTransaction(sourceQueue, messageIds, destinationQueue);
-            vhost.executeTransaction(txn);
+
+            if(isMoveTransaction)
+            {
+                sourceQueue.moveMessages(destinationQueue, messageIds);
+            }
+            else
+            {
+                sourceQueue.copyMessages(destinationQueue, messageIds);
+            }
+
             response.setStatus(HttpServletResponse.SC_OK);
 
         }

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.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/RestServlet.java?rev=1685175&r1=1685174&r2=1685175&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Fri Jun 12 21:23:38 2015
@@ -42,6 +42,7 @@ import org.apache.qpid.server.model.Conf
 import org.apache.qpid.server.model.ConfiguredObjectOperation;
 import org.apache.qpid.server.model.IllegalStateTransitionException;
 import org.apache.qpid.server.model.IntegrityViolationException;
+import org.apache.qpid.server.model.TypedContent;
 import org.apache.qpid.server.virtualhost.ExchangeExistsException;
 import org.apache.qpid.server.virtualhost.QueueExistsException;
 import org.codehaus.jackson.map.ObjectMapper;
@@ -552,11 +553,21 @@ public class RestServlet extends Abstrac
         }
         Object returnVal = operation.perform(subject, providedObject);
         response.setStatus(HttpServletResponse.SC_OK);
-        response.setContentType("application/json");
-        Writer writer = getOutputWriter(request, response);
-        ObjectMapper mapper = ConfiguredObjectJacksonModule.newObjectMapper();
-        mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
-        mapper.writeValue(writer, returnVal);
+        if(returnVal instanceof TypedContent)
+        {
+            TypedContent typedContent = (TypedContent)returnVal;
+            response.setContentType(typedContent.getContentType());
+            response.setContentLength(typedContent.getData().length);
+            getOutputStream(request, response).write(typedContent.getData());
+        }
+        else
+        {
+            response.setContentType("application/json");
+            Writer writer = getOutputWriter(request, response);
+            ObjectMapper mapper = ConfiguredObjectJacksonModule.newObjectMapper();
+            mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
+            mapper.writeValue(writer, returnVal);
+        }
 
     }
 



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