Juan Hernandez has uploaded a new change for review.

Change subject: restapi: Add "size" attribute support
......................................................................

restapi: Add "size" attribute support

This patch adds support for a new "size" attribute for collections. The
value of this parameter can be one of the following:

  include
    Indicates that the size attribute should be populated.

  exclude
    Indicates that the size attribute should't be populated. This will
    be the default in order to preserve backwards compatibility.

  only
    Indicates that only the size attribute should be populated, and
    that the actual data shouldn't. This is intended for situations
    where the caller wants to know the size of the collection but
    doesn't want to transfer a potentially large amount of data
    that won't actually be used.

When the size is populated it will look like this (for templates, for
example):

  GET /templates;size=include
  <templates>
    <size>123</size>
    <template id="..." href="...">
      ...
    </template>
    ...
  </templates>

When only the size is populated it will look like this:

  GET /templates;size=only
  <templates>
    <size>123</size>
  </templates>

This patch also includes support for this parameter in the templates
collection, as an example.

Change-Id: I6f39413ea33319a21fd48018017fce8030ecbf14
Bug-Url: https://bugzilla.redhat.com/1132249
Signed-off-by: Juan Hernandez <juan.hernan...@redhat.com>
---
A 
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviour.java
A 
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviourHelper.java
M 
backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
4 files changed, 160 insertions(+), 17 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/23/34223/1

diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviour.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviour.java
new file mode 100644
index 0000000..1633bab
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviour.java
@@ -0,0 +1,56 @@
+/*
+* Copyright (c) 2014 Red Hat, Inc.
+*
+* Licensed 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.ovirt.engine.api.common.util;
+
+/**
+ * This enum represents what should be the behaviour of the RESTAPI when it 
receives the {@code size} matrix parameter
+ * in a request to list a collection.
+ */
+public enum SizeBehaviour {
+    /**
+     * Indicates that the size should be included in the result.
+     */
+    INCLUDE,
+
+    /**
+     * Indicates that the size shouldn't be included in the result.
+     */
+    EXCLUDE,
+
+    /**
+     * Indicates that only the size should be included in the result, and that 
the actual data shouldn't be included.
+     * This is intended for situations where the caller only wants to count 
the number of items, without the overhead
+     * of transferring all their content.
+     */
+    ONLY;
+
+    /**
+     * This methods returns {@code true} iff the value of the enum indicates 
that size should be included in the
+     * result.
+     */
+    public boolean includeSize() {
+        return this != EXCLUDE;
+    }
+
+    /**
+     * This methods returns {@code true} iff the value of the enum indicates 
that actual data should be included in the
+     * result.
+     */
+    public boolean includeData() {
+        return this != ONLY;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviourHelper.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviourHelper.java
new file mode 100644
index 0000000..1f1b17a
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/SizeBehaviourHelper.java
@@ -0,0 +1,62 @@
+/*
+* Copyright (c) 2014 Red Hat, Inc.
+*
+* Licensed 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.ovirt.engine.api.common.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriInfo;
+
+/**
+ * A utility class to handle the {@code size} matrix parameter for 
collections. This parameter is used to control how the
+ * of the collection should be reported. See the {@link SizeBehaviour} class 
for details.
+ */
+public class SizeBehaviourHelper {
+    private static final Logger log = 
LoggerFactory.getLogger(SizeBehaviourHelper.class);
+    /**
+     * The name of the parameter.
+     */
+    private static final String PARAMETER_NAME = "size";
+
+    /**
+     * Analyzes the given URI and extracts the value of the {@code size} 
parameter. If the parameter isn't included
+     * in the URI, or it has an incorrect value, it will return the default 
value {@link SizeBehaviour#EXCLUDE} in order
+     * to preserve backwards compatibility.
+     *
+     * @param uri the URI where the parameter will be extracted from
+     * @return the value of the parameter if given, or {@link 
SizeBehaviour#EXCLUDE} if it not given or incorrect, will
+     *     never return {@code null}
+     */
+    public static SizeBehaviour getSizeBehaviour(UriInfo uri) {
+        // Extract the value from the matrix parameter:
+        MultivaluedMap<String, String> parameters = uri.getPathParameters();
+        String value = parameters.getFirst(PARAMETER_NAME);
+        if (value != null) {
+            String upper = value.toUpperCase();
+            try {
+                return SizeBehaviour.valueOf(upper);
+            }
+            catch (IllegalArgumentException exception) {
+                log.warn("Unknonwn size behaviour \"" + value + "\" requested, 
will use the default", exception);
+            }
+        }
+
+        // The default is to exclude the size, to preserve backwards 
compatibility:
+        return SizeBehaviour.EXCLUDE;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
index 0a2119a..b4c6662 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd
@@ -1214,7 +1214,17 @@
      <xs:complexContent>
       <xs:extension base="ActionableResource">
         <xs:sequence>
+          <!-- The "size" of the collection is the actual number of items
+               returned as a result. For example, when using the "max"
+               parameter the set of returned items may be different than
+               the total. -->
+          <xs:element name="size" type="xs:unsignedInt" minOccurs="0"/>
+
+          <!-- The "total" is the total number of items that match the
+               restrictions given by the caller, regardless of the value
+               of the "max" parameter. -->
           <xs:element name="total" type="xs:unsignedInt" minOccurs="0"/>
+
           <xs:element name="active" type="xs:unsignedInt" minOccurs="0"/>
         </xs:sequence>
       </xs:extension>
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
index 5067070..95f138e 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendTemplatesResource.java
@@ -7,6 +7,8 @@
 
 import javax.ws.rs.core.Response;
 
+import org.ovirt.engine.api.common.util.SizeBehaviourHelper;
+import org.ovirt.engine.api.common.util.SizeBehaviour;
 import org.ovirt.engine.api.model.Console;
 import org.ovirt.engine.api.model.Disk;
 import org.ovirt.engine.api.model.Template;
@@ -51,11 +53,15 @@
 
     @Override
     public Templates list() {
-        if (isFiltered())
-            return 
mapCollection(getBackendCollection(VdcQueryType.GetAllVmTemplates,
-                    new VdcQueryParametersBase()));
-        else
-            return mapCollection(getBackendCollection(SearchType.VmTemplate));
+        List<VmTemplate> entities;
+        if (isFiltered()) {
+            entities = getBackendCollection(VdcQueryType.GetAllVmTemplates,
+                    new VdcQueryParametersBase());
+        }
+        else {
+            entities = getBackendCollection(SearchType.VmTemplate);
+        }
+        return mapCollection(entities);
     }
 
     @Override
@@ -161,22 +167,31 @@
     }
 
     protected Templates mapCollection(List<VmTemplate> entities) {
-        // Fill VmInit for entities - the search query no join the VmInit to 
Templates
-        IdsQueryParameters params = new IdsQueryParameters();
-        List<Guid> ids = Entities.getIds(entities);
-        params.setId(ids);
-        VdcQueryReturnValue queryReturnValue = 
runQuery(VdcQueryType.GetVmsInit, params);
-        if (queryReturnValue.getSucceeded() && 
queryReturnValue.getReturnValue() != null) {
-            List<VmInit> vmInits = queryReturnValue.getReturnValue();
-            Map<Guid, VmInit> initMap = Entities.businessEntitiesById(vmInits);
-            for (VmTemplate template : entities) {
-                template.setVmInit(initMap.get(template.getId()));
+        SizeBehaviour sizeBehaviour = 
SizeBehaviourHelper.getSizeBehaviour(getUriInfo());
+
+        if (sizeBehaviour.includeData()) {
+            // Fill VmInit for entities - the search query no join the VmInit 
to Templates
+            IdsQueryParameters params = new IdsQueryParameters();
+            List<Guid> ids = Entities.getIds(entities);
+            params.setId(ids);
+            VdcQueryReturnValue queryReturnValue = 
runQuery(VdcQueryType.GetVmsInit, params);
+            if (queryReturnValue.getSucceeded() && 
queryReturnValue.getReturnValue() != null) {
+                List<VmInit> vmInits = queryReturnValue.getReturnValue();
+                Map<Guid, VmInit> initMap = 
Entities.businessEntitiesById(vmInits);
+                for (VmTemplate template : entities) {
+                    template.setVmInit(initMap.get(template.getId()));
+                }
             }
         }
 
         Templates collection = new Templates();
-        for (VmTemplate entity : entities) {
-            collection.getTemplates().add(addLinks(populate(map(entity), 
entity)));
+        if (sizeBehaviour.includeData()) {
+            for (VmTemplate entity : entities) {
+                collection.getTemplates().add(addLinks(populate(map(entity), 
entity)));
+            }
+        }
+        if (sizeBehaviour.includeSize()) {
+            collection.setSize((long) entities.size());
         }
         return collection;
     }


-- 
To view, visit http://gerrit.ovirt.org/34223
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6f39413ea33319a21fd48018017fce8030ecbf14
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Juan Hernandez <juan.hernan...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to