Return-Path: X-Original-To: apmail-incubator-cloudstack-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-cloudstack-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6DD30D534 for ; Fri, 25 Jan 2013 03:32:00 +0000 (UTC) Received: (qmail 98930 invoked by uid 500); 25 Jan 2013 03:32:00 -0000 Delivered-To: apmail-incubator-cloudstack-commits-archive@incubator.apache.org Received: (qmail 98415 invoked by uid 500); 25 Jan 2013 03:31:59 -0000 Mailing-List: contact cloudstack-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: cloudstack-dev@incubator.apache.org Delivered-To: mailing list cloudstack-commits@incubator.apache.org Received: (qmail 95817 invoked by uid 99); 25 Jan 2013 03:31:48 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 25 Jan 2013 03:31:48 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 10B7682518E; Fri, 25 Jan 2013 03:31:47 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: bhaisaab@apache.org To: cloudstack-commits@incubator.apache.org X-Mailer: ASF-Git Admin Mailer Subject: [30/50] [abbrv] git commit: ReflectUtil: Use collections to grow list and not manual array memory management Message-Id: <20130125033148.10B7682518E@tyr.zones.apache.org> Date: Fri, 25 Jan 2013 03:31:47 +0000 (UTC) ReflectUtil: Use collections to grow list and not manual array memory management Fix usage in ApiDispatcher. Add two kinds of helpers: - One that gets list of exclude cmd whose fields are not be included - One that loops till a base class is asssignable from superclass Signed-off-by: Rohit Yadav Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/7a927e36 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/7a927e36 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/7a927e36 Branch: refs/heads/javelin Commit: 7a927e36f0824f0a74d6a57f68ff38bfc0dcade6 Parents: 34f3e1c Author: Rohit Yadav Authored: Wed Jan 23 13:53:00 2013 -0800 Committer: Rohit Yadav Committed: Wed Jan 23 14:57:41 2013 -0800 ---------------------------------------------------------------------- server/src/com/cloud/api/ApiDispatcher.java | 4 +- utils/src/com/cloud/utils/ReflectUtil.java | 48 ++++++++++++++------- 2 files changed, 34 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a927e36/server/src/com/cloud/api/ApiDispatcher.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 129ef7d..4ca040c 100755 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -27,6 +27,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.StringTokenizer; import java.util.regex.Matcher; @@ -190,8 +191,7 @@ public class ApiDispatcher { } } - Field[] fields = ReflectUtil.getAllFieldsForClass(cmd.getClass(), - new Class[] {BaseCmd.class}); + List fields = ReflectUtil.getAllFieldsForClass(cmd.getClass(), BaseCmd.class); for (Field field : fields) { PlugService plugServiceAnnotation = field.getAnnotation(PlugService.class); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a927e36/utils/src/com/cloud/utils/ReflectUtil.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/ReflectUtil.java b/utils/src/com/cloud/utils/ReflectUtil.java index 0944705..e5a890a 100755 --- a/utils/src/com/cloud/utils/ReflectUtil.java +++ b/utils/src/com/cloud/utils/ReflectUtil.java @@ -19,7 +19,10 @@ package com.cloud.utils; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import com.cloud.utils.exception.CloudRuntimeException; @@ -87,26 +90,39 @@ public class ReflectUtil { return isAsync; } - // Returns all fields across the base class for a cmd - public static Field[] getAllFieldsForClass(Class cmdClass, - Class[] searchClasses) { - Field[] fields = cmdClass.getDeclaredFields(); + // Returns all fields until a base class for a cmd class + public static List getAllFieldsForClass(Class cmdClass, + Class baseClass) { + List fields = new ArrayList(); + Collections.addAll(fields, cmdClass.getDeclaredFields()); + Class superClass = cmdClass.getSuperclass(); + while (baseClass.isAssignableFrom(superClass)) { + Field[] superClassFields = superClass.getDeclaredFields(); + if (superClassFields != null) + Collections.addAll(fields, superClassFields); + superClass = superClass.getSuperclass(); + } + return fields; + } + + // Returns all unique fields except excludeClasses for a cmd class + public static Set getAllFieldsForClass(Class cmdClass, + Class[] excludeClasses) { + Set fields = new HashSet(); + Collections.addAll(fields, cmdClass.getDeclaredFields()); Class superClass = cmdClass.getSuperclass(); while (superClass != null && superClass != Object.class) { String superName = superClass.getName(); - for (Class baseClass: searchClasses) { - if(!baseClass.isAssignableFrom(superClass)) - continue; - if (!superName.equals(baseClass.getName())) { - Field[] superClassFields = superClass.getDeclaredFields(); - if (superClassFields != null) { - Field[] tmpFields = new Field[fields.length + superClassFields.length]; - System.arraycopy(fields, 0, tmpFields, 0, fields.length); - System.arraycopy(superClassFields, 0, tmpFields, fields.length, superClassFields.length); - fields = tmpFields; - } - } + boolean isNameEqualToSuperName = false; + for (Class baseClass: excludeClasses) + if (superName.equals(baseClass.getName())) + isNameEqualToSuperName = true; + + if (!isNameEqualToSuperName) { + Field[] superClassFields = superClass.getDeclaredFields(); + if (superClassFields != null) + Collections.addAll(fields, superClassFields); } superClass = superClass.getSuperclass(); }