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