Juan Hernandez has uploaded a new change for review.

Change subject: restapi: Improve details helper
......................................................................

restapi: Improve details helper

This patch improves the details helper so that details can be included and
excluded.

Change-Id: I31e10aa2df770dbb957586a6791766f72d324dfe
Related-To: Bug-Url: https://bugzilla.redhat.com/1132249
Signed-off-by: Juan Hernandez <juan.hernan...@redhat.com>
---
D 
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailHelper.java
A 
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/Details.java
A 
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailsHelper.java
M 
backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/DetailHelperTest.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostNicsResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
12 files changed, 319 insertions(+), 160 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/69/34569/1

diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailHelper.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailHelper.java
deleted file mode 100644
index 000b783..0000000
--- 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailHelper.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-* Copyright (c) 2010 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 java.util.EnumSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.ws.rs.core.HttpHeaders;
-
-public class DetailHelper {
-
-    private static final String ACCEPT = "Accept";
-    private static final String DETAIL = "detail";
-    private static final String PARAM_SEPARATOR = ";";
-    private static final String VALUE_SEPARATOR = "=";
-    private static final String DETAIL_SEPARATOR = "\\+";
-
-    public static boolean include(HttpHeaders httpheaders, String relation) {
-        List<String> accepts = httpheaders.getRequestHeader(ACCEPT);
-        if (!(accepts == null || accepts.isEmpty())) {
-            String[] parameters = accepts.get(0).split(PARAM_SEPARATOR);
-            for (String parameter : parameters) {
-                String[] includes = parameter.split(VALUE_SEPARATOR);
-                if (includes.length > 1 && 
DETAIL.equalsIgnoreCase(includes[0].trim())) {
-                    for (String rel : 
includes[1].trim().split(DETAIL_SEPARATOR)) {
-                        if (relation.equalsIgnoreCase(rel.trim())) {
-                            return true;
-                        }
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    public enum Detail {
-        DISKS,
-        NICS,
-        STATISTICS,
-        TAGS
-    }
-
-    public static Set<Detail> getDetails(HttpHeaders httpHeaders) {
-        Set<Detail> details = EnumSet.noneOf(Detail.class);
-        for (Detail detail : Detail.class.getEnumConstants()) {
-            if (include(httpHeaders, detail.name().toLowerCase())) {
-                details.add(detail);
-            }
-        }
-        return details;
-    }
-}
diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/Details.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/Details.java
new file mode 100644
index 0000000..68fdfd5
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/Details.java
@@ -0,0 +1,63 @@
+/*
+* 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 java.util.HashSet;
+import java.util.Set;
+
+/**
+ * This class represents what level of detail should be returned. It is 
basically a pair of sets that specify what to
+ * include and what to exclude.
+ */
+public class Details {
+    private Set<String> excluded = new HashSet<>();
+    private Set<String> included = new HashSet<>();
+
+    public void addIncluded(String what) {
+        included.add(what);
+    }
+
+    public boolean isIncluded(String what) {
+        return included.contains(what) && !excluded.contains(what);
+    }
+
+    public void addExcluded(String what) {
+        excluded.add(what);
+    }
+
+    public boolean isExcluded(String what) {
+        return excluded.contains(what) && included.contains(what);
+    }
+
+    public String toString() {
+        StringBuilder buffer = new StringBuilder();
+        for (String what : included) {
+            if (buffer.length() > 0) {
+                buffer.append(',');
+            }
+            buffer.append(what);
+        }
+        for (String what : excluded) {
+            if (buffer.length() > 0) {
+                buffer.append(',');
+            }
+            buffer.append('!');
+            buffer.append(what);
+        }
+        return buffer.toString();
+    }
+}
diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailsHelper.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailsHelper.java
new file mode 100644
index 0000000..bf759c9
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/DetailsHelper.java
@@ -0,0 +1,163 @@
+/*
+* 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.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HeaderElement;
+import org.apache.http.NameValuePair;
+import org.apache.http.message.BasicHeaderValueParser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriInfo;
+
+/**
+ * This class is responsible for determining what details should be included 
in a response. The details can be specified
+ * using the {@code detail} parameter of the HTTP {@code Accept} header, or 
with the {@code detail} matrix or query
+ * parameter. The value of this parameter should be a comma (or plus sign when 
using the {@code Accept} header)
+ * separated list of names. If the name is preceded by the an exclamation mark 
then it will be excluded, otherwise it
+ * will be included. For example, to request the information of NICs and disks 
using the header:
+ *
+ * <pre>
+ * GET /vms/{vm:id} HTTP/1.1
+ * Accept: application/xml; detail=nics+disks
+ * </pre>
+ *
+ * Note that when using the HTTP {@code Accept} header the separator should be 
the plus sign, as the comma is used to
+ * separate elements of HTTP headers and some web servers may get confused 
when using the comma.
+ *
+ * Same using a matrix parameter (this is the preferred way, as proxy servers 
may then cache the modified content):
+ *
+ * <pre>
+ * GET /vms/{vm:id};detail=nics,disks HTTP/1.1
+ * </pre>
+ *
+ * Same using a query parameter:
+ *
+ * <pre>
+ * GET /vms/{vm:id}?detail=nics,disks HTTP/1.1
+ * </pre>
+ *
+ * The exclamation mark is used to exclude some data that is included by 
default. For example, it could be used to
+ * specify that only the size of a collection is requested, but not its actual 
data:
+ *
+ * <pre>
+ * GET /vms;detail=size,!data HTTP/1.1
+ * </pre>
+ */
+public class DetailsHelper {
+    /**
+     * The name of the HTTP {@code Accept} header.
+     */
+    private static final String ACCEPT = "Accept";
+
+    /**
+     * The name of the header, matrix, or query parameter that contains the 
list of details to include or exclude.
+     */
+    private static final String DETAIL = "detail";
+
+    /**
+     * Determines what details to include or exclude from the {@code detail} 
parameter of the {@code Accept} header and
+     * from the {@code detail} matrix or query parameters.
+     *
+     * @param headers the object that gives access to the HTTP headers of the 
request, may be {@code null} in which case
+     *     it will be completely ignored
+     * @param uri the object that gives access to the URI information, may be 
{@code null} in which case it will be
+     *     completely ignored
+     * @return the object containing the extracted information, may be empty, 
but never {@code null}
+     */
+    public static Details getDetails(HttpHeaders headers, UriInfo uri) {
+        // We will collect the detail specifications obtained from different 
places into this list, for later
+        // processing:
+        List<String> specs = new ArrayList<>(1);
+
+        // Try to extract the specification of what to include/exclude from 
the accept header:
+        if (headers != null) {
+            List<String> headerValues = headers.getRequestHeader(ACCEPT);
+            for (String headerValue : headerValues) {
+                HeaderElement[] headerElements = 
BasicHeaderValueParser.parseElements(headerValue, null);
+                for (HeaderElement headerElement : headerElements) {
+                    for (NameValuePair parameter : 
headerElement.getParameters()) {
+                        if (StringUtils.equalsIgnoreCase(parameter.getName(), 
DETAIL)) {
+                            specs.add(parameter.getValue());
+                        }
+                    }
+                }
+            }
+        }
+
+        // Try also from the matrix parameters:
+        if (uri != null) {
+            List<String> parameters = uri.getPathParameters().get(DETAIL);
+            if (CollectionUtils.isNotEmpty(parameters)) {
+                for (String parameter : parameters) {
+                    specs.add(parameter);
+                }
+            }
+        }
+
+        // Try also from the query parameters:
+        if (uri != null) {
+            List<String> parameters = uri.getQueryParameters().get(DETAIL);
+            if (CollectionUtils.isNotEmpty(parameters)) {
+                for (String parameter : parameters) {
+                    specs.add(parameter);
+                }
+            }
+        }
+
+        // Process all the obtained detail specifications:
+        return parseDetails(specs);
+    }
+
+    /**
+     * Parses a string into the object that represents what to include or 
exclude.
+     *
+     * @param specs the specification of what to include or exclude
+     * @return the object that represents what to include or exclude, which 
may be completely empty, but never
+     *     {@code null}
+     */
+    private static Details parseDetails(List<String> specs) {
+        Details details = new Details();
+        if (CollectionUtils.isNotEmpty(specs)) {
+            for (String spec : specs) {
+                if (spec != null) {
+                    String[] chunks = spec.split("[+,]");
+                    if (ArrayUtils.isNotEmpty(chunks)) {
+                        for (String chunk : chunks) {
+                            chunk = chunk.trim();
+                            if (chunk.startsWith("!")) {
+                                chunk = chunk.substring(1).trim();
+                                if (StringUtils.isNotEmpty(chunk)) {
+                                    details.addExcluded(chunk);
+                                }
+                            }
+                            else {
+                                details.addIncluded(chunk);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return details;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/DetailHelperTest.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/DetailHelperTest.java
index 52940bf..a77bdd0 100644
--- 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/DetailHelperTest.java
+++ 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/test/java/org/ovirt/engine/api/common/util/DetailHelperTest.java
@@ -97,17 +97,18 @@
                        new boolean[] {false, false});
     }
 
-    private void doTestIncludes(String details, String[] rels, boolean[] 
expected) throws Exception {
+    private void doTestIncludes(String spec, String[] rels, boolean[] 
expected) throws Exception {
 
         HttpHeaders httpheaders = createMock(HttpHeaders.class);
         List<String> requestHeaders = new ArrayList<String>();
         
expect(httpheaders.getRequestHeader("Accept")).andReturn(requestHeaders).anyTimes();
-        requestHeaders.add(ACCEPTABLE + details);
+        requestHeaders.add(ACCEPTABLE + spec);
 
         replay(httpheaders);
 
         for (int i = 0; i < rels.length; i++) {
-            assertEquals(expected[i], DetailHelper.include(httpheaders, 
rels[i]));
+            Details details = DetailsHelper.getDetails(httpheaders, null);
+            assertEquals(expected[i], details.isIncluded(rels[i]));
         }
 
         verify(httpheaders);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostNicsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostNicsResource.java
index 58fb1e2..bc9de3c 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostNicsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostNicsResource.java
@@ -7,11 +7,10 @@
 import java.util.List;
 import java.util.Map;
 
-import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
 
-import org.ovirt.engine.api.common.util.DetailHelper;
+import org.ovirt.engine.api.common.util.Details;
+import org.ovirt.engine.api.common.util.DetailsHelper;
 import org.ovirt.engine.api.model.Action;
 import org.ovirt.engine.api.model.Bonding;
 import org.ovirt.engine.api.model.Host;
@@ -300,22 +299,23 @@
 
     @Override
     protected HostNIC deprecatedPopulate(HostNIC model, VdsNetworkInterface 
entity) {
-        return addStatistics(model, entity, uriInfo, httpHeaders);
-    }
-
-    HostNIC addStatistics(HostNIC model, VdsNetworkInterface entity, UriInfo 
ui, HttpHeaders httpHeaders) {
-        if (DetailHelper.include(httpHeaders, "statistics")) {
-            model.setStatistics(new Statistics());
-            HostNicStatisticalQuery query = new 
HostNicStatisticalQuery(newModel(model.getId()));
-            List<Statistic> statistics = query.getStatistics(entity);
-            for (Statistic statistic : statistics) {
-                LinkHelper.addLinks(ui, statistic, query.getParentType());
-            }
-            model.getStatistics().getStatistics().addAll(statistics);
+        Details details = DetailsHelper.getDetails(httpHeaders, uriInfo);
+        if (details.isIncluded("statistics")) {
+            addStatistics(model, entity);
         }
         return model;
     }
 
+    private void addStatistics(HostNIC model, VdsNetworkInterface entity) {
+        model.setStatistics(new Statistics());
+        HostNicStatisticalQuery query = new 
HostNicStatisticalQuery(newModel(model.getId()));
+        List<Statistic> statistics = query.getStatistics(entity);
+        for (Statistic statistic : statistics) {
+            LinkHelper.addLinks(uriInfo, statistic, query.getParentType());
+        }
+        model.getStatistics().getStatistics().addAll(statistics);
+    }
+
     protected class HostNicResolver extends EntityIdResolver<Guid> {
 
         private String name;
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java
index 1f544ff..86a1b1f 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java
@@ -18,6 +18,8 @@
 import org.ovirt.engine.api.model.LogicalUnit;
 import org.ovirt.engine.api.model.PowerManagement;
 import org.ovirt.engine.api.model.PowerManagementStatus;
+import org.ovirt.engine.api.model.Statistic;
+import org.ovirt.engine.api.model.Statistics;
 import org.ovirt.engine.api.resource.ActionResource;
 import org.ovirt.engine.api.resource.AssignedPermissionsResource;
 import org.ovirt.engine.api.resource.AssignedTagsResource;
@@ -27,6 +29,7 @@
 import org.ovirt.engine.api.resource.HostStorageResource;
 import org.ovirt.engine.api.resource.StatisticsResource;
 import org.ovirt.engine.api.restapi.model.AuthenticationMethod;
+import org.ovirt.engine.api.utils.LinkHelper;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.ApproveVdsParameters;
 import org.ovirt.engine.core.common.action.ChangeVDSClusterParameters;
@@ -397,9 +400,9 @@
 
     @Override
     protected Host deprecatedPopulate(Host model, VDS entity) {
-        Host host = parent.addStatistics(model, entity, uriInfo, httpHeaders);
-        parent.addCertificateInfo(host);
-        return host;
+        parent.addStatistics(model, entity);
+        parent.addCertificateInfo(model);
+        return model;
     }
 
     public BackendHostsResource getParent() {
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
index e58c871..4b29c7e 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
@@ -2,11 +2,10 @@
 
 import java.util.List;
 
-import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
 
-import org.ovirt.engine.api.common.util.DetailHelper;
+import org.ovirt.engine.api.common.util.Details;
+import org.ovirt.engine.api.common.util.DetailsHelper;
 import org.ovirt.engine.api.model.Action;
 import org.ovirt.engine.api.model.Certificate;
 import org.ovirt.engine.api.model.Cluster;
@@ -125,22 +124,22 @@
 
     @Override
     protected Host deprecatedPopulate(Host model, VDS entity) {
-        Host host = addStatistics(model, entity, uriInfo, httpHeaders);
-        addCertificateInfo(host);
-        return host;
+        Details details = DetailsHelper.getDetails(httpHeaders, uriInfo);
+        if (details.isIncluded("statistics")) {
+            addStatistics(model, entity);
+        }
+        addCertificateInfo(model);
+        return model;
     }
 
-    Host addStatistics(Host model, VDS entity, UriInfo ui, HttpHeaders 
httpHeaders) {
-        if (DetailHelper.include(httpHeaders, "statistics")) {
-            model.setStatistics(new Statistics());
-            HostStatisticalQuery query = new 
HostStatisticalQuery(newModel(model.getId()));
-            List<Statistic> statistics = query.getStatistics(entity);
-            for (Statistic statistic : statistics) {
-                LinkHelper.addLinks(ui, statistic, query.getParentType());
-            }
-            model.getStatistics().getStatistics().addAll(statistics);
+    public void addStatistics(Host model, VDS entity) {
+        model.setStatistics(new Statistics());
+        HostStatisticalQuery query = new 
HostStatisticalQuery(newModel(model.getId()));
+        List<Statistic> statistics = query.getStatistics(entity);
+        for (Statistic statistic : statistics) {
+            LinkHelper.addLinks(uriInfo, statistic, query.getParentType());
         }
-        return model;
+        model.getStatistics().getStatistics().addAll(statistics);
     }
 
     private Hosts mapCollection(List<VDS> entities) {
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java
index 18d53ba..058a3bf 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmDisksResource.java
@@ -1,12 +1,11 @@
 package org.ovirt.engine.api.restapi.resource;
 
 import java.util.List;
-import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
 
 import org.apache.commons.lang.BooleanUtils;
-import org.ovirt.engine.api.common.util.DetailHelper;
+import org.ovirt.engine.api.common.util.Details;
+import org.ovirt.engine.api.common.util.DetailsHelper;
 import org.ovirt.engine.api.model.Action;
 import org.ovirt.engine.api.model.Disk;
 import org.ovirt.engine.api.model.Disks;
@@ -193,22 +192,23 @@
 
     @Override
     protected Disk deprecatedPopulate(Disk model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
-        return addStatistics(model, entity, uriInfo, httpHeaders);
-    }
-
-    Disk addStatistics(Disk model, 
org.ovirt.engine.core.common.businessentities.Disk entity, UriInfo ui, 
HttpHeaders httpHeaders) {
-        if (DetailHelper.include(httpHeaders, "statistics")) {
-            model.setStatistics(new Statistics());
-            DiskStatisticalQuery query = new 
DiskStatisticalQuery(newModel(model.getId()));
-            List<Statistic> statistics = query.getStatistics(entity);
-            for (Statistic statistic : statistics) {
-                LinkHelper.addLinks(ui, statistic, query.getParentType());
-            }
-            model.getStatistics().getStatistics().addAll(statistics);
+        Details details = DetailsHelper.getDetails(httpHeaders, uriInfo);
+        if (details.isIncluded("statistics")) {
+            addStatistics(model, entity);
         }
         return model;
     }
 
+    private void addStatistics(Disk model, 
org.ovirt.engine.core.common.businessentities.Disk entity) {
+        model.setStatistics(new Statistics());
+        DiskStatisticalQuery query = new 
DiskStatisticalQuery(newModel(model.getId()));
+        List<Statistic> statistics = query.getStatistics(entity);
+        for (Statistic statistic : statistics) {
+            LinkHelper.addLinks(uriInfo, statistic, query.getParentType());
+        }
+        model.getStatistics().getStatistics().addAll(statistics);
+    }
+
     private Response attachDiskToVm(Disk disk) {
         boolean isDiskActive = 
BooleanUtils.toBooleanDefaultIfNull(disk.isActive(), false);
         boolean isDiskReadOnly = 
BooleanUtils.toBooleanDefaultIfNull(disk.isReadOnly(), false);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java
index f41a7c3..6644742 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicResource.java
@@ -61,7 +61,8 @@
 
             model.setPortMirroring(portMirroring);
         }
-        return parent.addStatistics(model, entity, uriInfo, httpHeaders);
+        parent.addStatistics(model, entity);
+        return model;
     }
 
     @Override
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java
index 3d0d575..acfc57c 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmNicsResource.java
@@ -4,12 +4,11 @@
 import java.util.List;
 
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
 
 import org.apache.commons.lang.StringUtils;
-import org.ovirt.engine.api.common.util.DetailHelper;
+import org.ovirt.engine.api.common.util.Details;
+import org.ovirt.engine.api.common.util.DetailsHelper;
 import org.ovirt.engine.api.model.Fault;
 import org.ovirt.engine.api.model.NIC;
 import org.ovirt.engine.api.model.ReportedDevice;
@@ -130,23 +129,24 @@
 
     @Override
     protected NIC deprecatedPopulate(NIC model, VmNetworkInterface entity) {
+        Details details = DetailsHelper.getDetails(httpHeaders, uriInfo);
         addReportedDevices(model, entity);
-        return addStatistics(model, entity, uriInfo, httpHeaders);
-    }
-
-    NIC addStatistics(NIC model, VmNetworkInterface entity, UriInfo ui, 
HttpHeaders httpHeaders) {
-        if (DetailHelper.include(httpHeaders, "statistics")) {
-            model.setStatistics(new Statistics());
-            NicStatisticalQuery query = new 
NicStatisticalQuery(newModel(model.getId()));
-            List<Statistic> statistics = query.getStatistics(entity);
-            for (Statistic statistic : statistics) {
-                LinkHelper.addLinks(ui, statistic, query.getParentType());
-            }
-            model.getStatistics().getStatistics().addAll(statistics);
+        if (details.isIncluded("statistics")) {
+            addStatistics(model, entity);
         }
         return model;
     }
 
+    public void addStatistics(NIC model, VmNetworkInterface entity) {
+        model.setStatistics(new Statistics());
+        NicStatisticalQuery query = new 
NicStatisticalQuery(newModel(model.getId()));
+        List<Statistic> statistics = query.getStatistics(entity);
+        for (Statistic statistic : statistics) {
+            LinkHelper.addLinks(uriInfo, statistic, query.getParentType());
+        }
+        model.getStatistics().getStatistics().addAll(statistics);
+    }
+
     void addReportedDevices(NIC model, VmNetworkInterface entity) {
         List<ReportedDevice> devices = getDevices(entity.getVmId(), 
entity.getMacAddress());
         if (!devices.isEmpty()) {
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java
index d90abef..b0ebf0b 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmResource.java
@@ -4,15 +4,13 @@
 import static org.ovirt.engine.core.utils.Ticketing.generateOTP;
 
 import java.util.List;
-import java.util.Set;
 
 import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
-import org.ovirt.engine.api.common.util.DetailHelper;
-import org.ovirt.engine.api.common.util.DetailHelper.Detail;
+import org.ovirt.engine.api.common.util.Details;
+import org.ovirt.engine.api.common.util.DetailsHelper;
 import org.ovirt.engine.api.common.util.QueryHelper;
 import org.ovirt.engine.api.model.Action;
 import org.ovirt.engine.api.model.AuthorizedKey;
@@ -485,26 +483,25 @@
 
     @Override
     protected VM deprecatedPopulate(VM model, 
org.ovirt.engine.core.common.businessentities.VM entity) {
-        Set<Detail> details = DetailHelper.getDetails(getHttpHeaders());
+        Details details = DetailsHelper.getDetails(httpHeaders, uriInfo);
         parent.addInlineDetails(details, model);
-        addStatistics(model, entity, uriInfo, httpHeaders);
+        if (details.isIncluded("statistics")) {
+            addStatistics(model, entity, uriInfo);
+        }
         parent.setPayload(model);
         parent.setBallooning(model);
         parent.setCertificateInfo(model);
         return model;
     }
 
-    VM addStatistics(VM model, 
org.ovirt.engine.core.common.businessentities.VM entity, UriInfo ui, 
HttpHeaders httpHeaders) {
-        if (DetailHelper.include(httpHeaders, "statistics")) {
-            model.setStatistics(new Statistics());
-            VmStatisticalQuery query = new 
VmStatisticalQuery(newModel(model.getId()));
-            List<Statistic> statistics = query.getStatistics(entity);
-            for (Statistic statistic : statistics) {
-                LinkHelper.addLinks(ui, statistic, query.getParentType());
-            }
-            model.getStatistics().getStatistics().addAll(statistics);
+    private void addStatistics(VM model, 
org.ovirt.engine.core.common.businessentities.VM entity, UriInfo ui) {
+        model.setStatistics(new Statistics());
+        VmStatisticalQuery query = new 
VmStatisticalQuery(newModel(model.getId()));
+        List<Statistic> statistics = query.getStatistics(entity);
+        for (Statistic statistic : statistics) {
+            LinkHelper.addLinks(ui, statistic, query.getParentType());
         }
-        return model;
+        model.getStatistics().getStatistics().addAll(statistics);
     }
 
     protected class UpdateParametersProvider implements
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
index 28c4b2a..70bbc4a 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmsResource.java
@@ -5,13 +5,12 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.Response;
 
-import org.ovirt.engine.api.common.util.DetailHelper;
-import org.ovirt.engine.api.common.util.DetailHelper.Detail;
+import org.ovirt.engine.api.common.util.Details;
+import org.ovirt.engine.api.common.util.DetailsHelper;
 import org.ovirt.engine.api.model.Action;
 import org.ovirt.engine.api.model.Certificate;
 import org.ovirt.engine.api.model.Configuration;
@@ -453,14 +452,14 @@
         return diskImages;
     }
 
-    protected VM addInlineDetails(Set<Detail> details, VM vm) {
-        if (details.contains(Detail.DISKS)) {
+    protected VM addInlineDetails(Details details, VM vm) {
+        if (details.isIncluded("disks")) {
             addInlineDisks(vm);
         }
-        if (details.contains(Detail.NICS)) {
+        if (details.isIncluded("nics")) {
             addInlineNics(vm);
         }
-        if (details.contains(Detail.TAGS)) {
+        if (details.isIncluded("tags")) {
             addInlineTags(vm);
         }
         return vm;
@@ -664,9 +663,9 @@
 
     @Override
     protected VM deprecatedPopulate(VM model, 
org.ovirt.engine.core.common.businessentities.VM entity) {
-        Set<Detail> details = DetailHelper.getDetails(getHttpHeaders());
+        Details details = DetailsHelper.getDetails(httpHeaders, uriInfo);
         model = addInlineDetails(details, model);
-        if (details.contains(Detail.STATISTICS)) {
+        if (details.isIncluded("statistics")) {
             addInlineStatistics(model);
         }
         return model;


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I31e10aa2df770dbb957586a6791766f72d324dfe
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