You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2016/12/04 11:00:10 UTC

svn commit: r1772521 - in /qpid/java/trunk: broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/ broker-plugins/management-http/src/main/java/org/apache/qpid/server/managem...

Author: kwall
Date: Sun Dec  4 11:00:10 2016
New Revision: 1772521

URL: http://svn.apache.org/viewvc?rev=1772521&view=rev
Log:
QPID-7571: [Java Broker] Allow model to designate a operation parameter as not nullable

Invoking a configured model op without a parameter (without default) designated as not nullable with cause a clear error.  Parameters that are of type primitive
are always considered not nullable.  Default values respected.

Modified:
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameter.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromAnnotation.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromInjection.java
    qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Param.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/InjectedAttributeTest.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/TestKitCarImpl.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/ApiDocsServlet.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/apidocs.css

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/BrokerAttributeInjector.java Sun Dec  4 11:00:10 2016
@@ -248,13 +248,14 @@ public class BrokerAttributeInjector imp
                                                             String.class,
                                                             "",
                                                             "the system-dependent filename",
-                                                            new String[0]);
+                                                            new String[0], true);
             params[1] = new OperationParameterFromInjection("live",
                                                             boolean.class,
                                                             boolean.class,
                                                             "true",
                                                             "if true dump only live objects i.e. objects that are reachable from others",
-                                                            new String[]{Boolean.TRUE.toString(), Boolean.FALSE.toString()});
+                                                            new String[]{Boolean.TRUE.toString(), Boolean.FALSE.toString()},
+                                                            true);
             ConfiguredObjectInjectedOperation<?> setVMOptionOperation = new ConfiguredObjectInjectedOperation(
                     "dumpHeap",
                     "Dumps the heap to the outputFile file in the same format as the hprof heap dump.",
@@ -286,7 +287,7 @@ public class BrokerAttributeInjector imp
                                                                                  ParameterizedTypes.MAP_OF_STRING_STRING,
                                                                                  "",
                                                                                  "JVM options map",
-                                                                                 new String[0])};
+                                                                                 new String[0], true)};
             ConfiguredObjectInjectedOperation<?> setVMOptionOperation = new ConfiguredObjectInjectedOperation(
                     "setJVMOptions",
                     "Sets given JVM options",

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectInjectedOperation.java Sun Dec  4 11:00:10 2016
@@ -196,6 +196,14 @@ public class ConfiguredObjectInjectedOpe
         {
             providedVal = null;
         }
+        if (providedVal == null && !param.isNullable())
+        {
+            throw new IllegalArgumentException(String.format("Parameter %s of operation %s in %s requires a non-null value",
+                                                             param.getName(),
+                                                             _operation.getName(),
+                                                             _operation.getDeclaringClass().getSimpleName()));
+        }
+
         final AttributeValueConverter<?> converter =
                 AttributeValueConverter.getConverter(AttributeValueConverter.convertPrimitiveToBoxed(param.getType()),
                                                      param.getGenericType());

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectMethodOperation.java Sun Dec  4 11:00:10 2016
@@ -167,6 +167,14 @@ public class ConfiguredObjectMethodOpera
         {
             providedVal = null;
         }
+        if (providedVal == null && !param.isNullable())
+        {
+            throw new IllegalArgumentException(String.format("Parameter %s of operation %s in %s requires a non-null value",
+                                                             param.getName(),
+                                                             _operation.getName(),
+                                                             _objectType));
+        }
+
         final AttributeValueConverter<?> converter =
                 AttributeValueConverter.getConverter(AttributeValueConverter.convertPrimitiveToBoxed(param.getType()),
                                                      param.getGenericType());

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameter.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameter.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameter.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameter.java Sun Dec  4 11:00:10 2016
@@ -38,4 +38,6 @@ public interface OperationParameter
     Type getGenericType();
 
     boolean isCompatible(OperationParameter that);
+
+    boolean isNullable();
 }

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromAnnotation.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromAnnotation.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromAnnotation.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromAnnotation.java Sun Dec  4 11:00:10 2016
@@ -74,6 +74,11 @@ public class OperationParameterFromAnnot
         return _genericType;
     }
 
+    @Override
+    public boolean isNullable()
+    {
+        return _param.nullable() && !_type.isPrimitive();
+    }
 
     @Override
     public boolean isCompatible(final OperationParameter that)

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromInjection.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromInjection.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromInjection.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/OperationParameterFromInjection.java Sun Dec  4 11:00:10 2016
@@ -33,19 +33,22 @@ public class OperationParameterFromInjec
     private final String _defaultValue;
     private final String _description;
     private final List<String> _validValues;
+    private final boolean _nullable;
 
     public OperationParameterFromInjection(final String name,
                                            final Class<?> type,
                                            final Type genericType,
                                            final String defaultValue,
                                            final String description,
-                                           final String[] validValues)
+                                           final String[] validValues,
+                                           final boolean nullable)
     {
         _type = type;
         _genericType = genericType;
         _name = name;
         _defaultValue = defaultValue;
         _description = description;
+        _nullable = nullable;
         _validValues = validValues == null ? Collections.<String>emptyList() : Collections.unmodifiableList(Arrays.asList(validValues));
     }
 
@@ -85,6 +88,11 @@ public class OperationParameterFromInjec
         return _genericType;
     }
 
+    @Override
+    public boolean isNullable()
+    {
+        return _nullable && !_type.isPrimitive();
+    }
 
     @Override
     public boolean isCompatible(final OperationParameter that)

Modified: qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Param.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Param.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Param.java (original)
+++ qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Param.java Sun Dec  4 11:00:10 2016
@@ -32,4 +32,5 @@ public @interface Param
     String defaultValue() default "";
     String description() default "";
     String[] validValues() default {};
+    boolean nullable() default true;
 }

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=1772521&r1=1772520&r2=1772521&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 Sun Dec  4 11:00:10 2016
@@ -69,12 +69,12 @@ public class ConfiguredObjectTypeRegistr
 
     public void testManagedInterfaces()
     {
-        // The electric engine is recharable
+        // The electric engine is rechargable
         Set<Class<? extends ManagedInterface>> elecEngIntfcs = _typeRegistry.getManagedInterfaces(TestElecEngine.class);
         assertThat(elecEngIntfcs, hasItem(TestRechargeable.class));
         assertThat(elecEngIntfcs.size(), is(1));
 
-        // The pertrol engine implements no additional interfaces
+        // The petrol engine implements no additional interfaces
         Set<Class<? extends ManagedInterface>> stdCarIntfcs = _typeRegistry.getManagedInterfaces(TestPetrolEngine.class);
         assertThat(stdCarIntfcs.size(), is(0));
     }
@@ -92,7 +92,6 @@ public class ConfiguredObjectTypeRegistr
 
         final Map<String, ConfiguredObjectOperation<?>> kitCarOperations =
                 _typeRegistry.getOperations(object.getClass());
-        assertEquals(2, kitCarOperations.size());
         assertTrue(kitCarOperations.containsKey("openDoor"));
         final ConfiguredObjectOperation<TestCar<?>> operation =
                 (ConfiguredObjectOperation<TestCar<?>>) kitCarOperations.get("openDoor");
@@ -126,6 +125,39 @@ public class ConfiguredObjectTypeRegistr
         }
     }
 
+    public void testOperationsRejectsNullParameter()
+    {
+        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);
+        Map<String, ConfiguredObjectOperation<?>> operations = _typeRegistry.getOperations(object.getClass());
+
+        ConfiguredObjectOperation<TestCar<?>> operation = (ConfiguredObjectOperation<TestCar<?>>) operations.get("startEngine");
+
+        try
+        {
+            operation.perform(object, Collections.<String, Object>emptyMap());
+            fail("Exception not thrown");
+        }
+        catch (IllegalArgumentException e)
+        {
+            // PASS
+        }
+
+        try
+        {
+            operation.perform(object, Collections.singletonMap("keyCode", null));
+            fail("Exception not thrown");
+        }
+        catch (IllegalArgumentException e)
+        {
+            // PASS
+        }
+    }
+
     public void testEnumValidValues_UnrestrictedSet() throws Exception
     {
         Map<String, ConfiguredObjectAttribute<?, ?>> attributeTypes = _typeRegistry.getAttributeTypes(TestCar.class);

Modified: qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java (original)
+++ qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/model/testmodels/hierarchy/InjectedAttributeTest.java Sun Dec  4 11:00:10 2016
@@ -368,7 +368,8 @@ public class InjectedAttributeTest exten
                 };
 
         final OperationParameter[] params = new OperationParameter[1];
-        params[0] = new OperationParameterFromInjection("height", Integer.TYPE, Integer.TYPE, "", "", new String[0]);
+        params[0] = new OperationParameterFromInjection("height", Integer.TYPE, Integer.TYPE, "", "", new String[0],
+                                                        true);
         final ConfiguredObjectInjectedOperation<?> operationInjector =
                 new ConfiguredObjectInjectedOperation<TestCar<?>>("fly", "", true,
                                                                   false,
@@ -409,7 +410,8 @@ public class InjectedAttributeTest exten
                 };
 
         final OperationParameter[] params = new OperationParameter[1];
-        params[0] = new OperationParameterFromInjection("count", Integer.TYPE, Integer.TYPE, "", "", new String[0]);
+        params[0] = new OperationParameterFromInjection("count", Integer.TYPE, Integer.TYPE, "", "", new String[0],
+                                                        true);
 
         final ConfiguredObjectInjectedOperation<?> hello =
                 new ConfiguredObjectInjectedOperation<TestCar<?>>("sayHello", "", true,

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=1772521&r1=1772520&r2=1772521&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 Sun Dec  4 11:00:10 2016
@@ -47,4 +47,7 @@ public interface TestCar<X extends TestC
 
     @ManagedOperation(changesConfiguredObjectState = false)
     Door openDoor(@Param(name = "door") Door door);
+
+    @ManagedOperation(changesConfiguredObjectState = false)
+    void startEngine(@Param(name = "keyCode", nullable = false) String keyCode);
 }

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=1772521&r1=1772520&r2=1772521&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 Sun Dec  4 11:00:10 2016
@@ -82,6 +82,11 @@ public class TestKitCarImpl extends Abst
     }
 
     @Override
+    public void startEngine(final String keyCode)
+    {
+    }
+
+    @Override
     public Map<String, Object> getParameters()
     {
         return _parameters;

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=1772521&r1=1772520&r2=1772521&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 Sun Dec  4 11:00:10 2016
@@ -103,6 +103,11 @@ public class TestStandardCarImpl extends
     }
 
     @Override
+    public void startEngine(final String keyCode)
+    {
+    }
+
+    @Override
     public Colour getBodyColour()
     {
         return _bodyColour;

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.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/ApiDocsServlet.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ApiDocsServlet.java Sun Dec  4 11:00:10 2016
@@ -418,7 +418,7 @@ public class ApiDocsServlet extends Abst
         writer.append("<table class=\"parameters\">");
         writer.append("<thead>");
         writer.append(
-                "<tr><th class=\"name\">Parameter Name</th><th class=\"type\">Type</th><th class=\"description\">Description</th></tr>");
+                "<tr><th class=\"name\">Parameter Name</th><th>Type</th><th>Default</th><th>Nullable?</th><th>Description</th></tr>");
         writer.append("</thead>");
         writer.append("<tbody>");
 
@@ -428,6 +428,10 @@ public class ApiDocsServlet extends Abst
                           + param.getName()
                           + "</td><td class=\"type\">"
                           + renderType(param)
+                          + "</td><td class=\"default\">"
+                          + param.getDefaultValue()
+                          + "</td><td class=\"nullable\">"
+                          + param.isNullable()
                           + "</td><td class=\"description\">"
                           + param.getDescription()
                           + "</td></tr>");

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.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/MetaDataServlet.java?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java Sun Dec  4 11:00:10 2016
@@ -263,6 +263,7 @@ public class MetaDataServlet extends Abs
                     Map<String, Object> paramAttrs = new LinkedHashMap<>();
 
                     paramAttrs.put("type", param.getType().getSimpleName());
+                    paramAttrs.put("nullable", param.isNullable());
                     if (!"".equals(param.getDefaultValue()))
                     {
                         paramAttrs.put("defaultValue", param.getDefaultValue());

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/apidocs.css
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/apidocs.css?rev=1772521&r1=1772520&r2=1772521&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/apidocs.css (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/css/apidocs.css Sun Dec  4 11:00:10 2016
@@ -68,6 +68,14 @@ table.parameters td.type {
     width: 20em;
 }
 
+table.parameters td.default {
+    width: 20em;
+}
+
+table.parameters td.nullable {
+    width: 15em;
+}
+
 table.api td,th {
     vertical-align: top;
 }



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