You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2013/01/03 03:44:12 UTC

[3/4] git commit: server: ApiServer inits with processing cmd classes to fill apiname:class mapping

server: ApiServer inits with processing cmd classes to fill apiname:class mapping

- Add maven dependency reflections (wtfl license, apl compliant)
- Use reflections to recurse and get apiname:class mapping

Signed-off-by: Rohit Yadav <bh...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/580bf857
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/580bf857
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/580bf857

Branch: refs/heads/api_refactoring
Commit: 580bf857ff41cd6bff36f8cfdb8e821d7978598d
Parents: 072c6f1
Author: Rohit Yadav <bh...@apache.org>
Authored: Wed Jan 2 18:34:54 2013 -0800
Committer: Rohit Yadav <bh...@apache.org>
Committed: Wed Jan 2 18:43:59 2013 -0800

----------------------------------------------------------------------
 server/pom.xml                          |    5 +++
 server/src/com/cloud/api/ApiServer.java |   43 ++++++++++++++-----------
 2 files changed, 29 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/580bf857/server/pom.xml
----------------------------------------------------------------------
diff --git a/server/pom.xml b/server/pom.xml
index c253e43..1fd1831 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -79,6 +79,11 @@
       <classifier>tests</classifier>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.reflections</groupId>
+      <artifactId>reflections</artifactId>
+      <version>0.9.8</version>
+    </dependency>
   </dependencies>
   <build>
     <defaultGoal>install</defaultGoal>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/580bf857/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index 5ee7c35..b853094 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -119,10 +119,8 @@ import com.cloud.user.User;
 import com.cloud.user.UserAccount;
 import com.cloud.user.UserContext;
 import com.cloud.user.UserVO;
-import com.cloud.utils.IdentityProxy;
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.Adapters;
-import com.cloud.utils.PropertiesUtil;
 import com.cloud.utils.StringUtils;
 import com.cloud.utils.component.ComponentLocator;
 import com.cloud.utils.component.Inject;
@@ -133,6 +131,8 @@ import com.cloud.utils.exception.CSExceptionErrorCode;
 import com.cloud.uuididentity.dao.IdentityDao;
 import com.cloud.acl.APIAccessChecker;
 
+import org.reflections.Reflections;
+
 public class ApiServer implements HttpRequestHandler {
     private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName());
     private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName());
@@ -152,6 +152,7 @@ public class ApiServer implements HttpRequestHandler {
     private static int _workerCount = 0;
     private static ApiServer s_instance = null;
     private static final DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
+    private Map<String, Class<?>> _apiNameCmdClassMap = new HashMap<String, Class<?>>();
 
     private static ExecutorService _executor = new ThreadPoolExecutor(10, 150, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory("ApiServer"));
 
@@ -199,6 +200,19 @@ public class ApiServer implements HttpRequestHandler {
             }
         }
 
+        // Populate api name and cmd class mappings
+        Reflections reflections = new Reflections("org.apache.cloudstack");
+        Set<Class<?>> cmdClasses = reflections.getTypesAnnotatedWith(APICommand.class);
+        reflections = new Reflections("com.cloud.api");
+        cmdClasses.addAll(reflections.getTypesAnnotatedWith(APICommand.class));
+        for(Class<?> cmdClass: cmdClasses) {
+            String apiName = cmdClass.getAnnotation(APICommand.class).name();
+            if (_apiNameCmdClassMap.containsKey(apiName)) {
+                s_logger.error("Cmd class " + cmdClass.getName() + " conflicts on apiname" + apiName);
+            }
+            _apiNameCmdClassMap.put(apiName, cmdClass);
+        }
+
         encodeApiResponse = Boolean.valueOf(configDao.getValue(Config.EncodeApiResponse.key()));
         String jsonType = configDao.getValue(Config.JavaScriptDefaultContentType.key());
         if (jsonType != null) {
@@ -322,9 +336,8 @@ public class ApiServer implements HttpRequestHandler {
                     paramMap.put(key, decodedValue);
                 }
 
-                String cmdClassName = getCmdClassName(command[0]);
-                if (cmdClassName != null) {
-                    Class<?> cmdClass = Class.forName(cmdClassName);
+                Class<?> cmdClass = getCmdClass(command[0]);
+                if (cmdClass != null) {
                     BaseCmd cmdObj = (BaseCmd) cmdClass.newInstance();
                     cmdObj.setFullUrlParams(paramMap);
                     cmdObj.setResponseType(responseType);
@@ -795,15 +808,8 @@ public class ApiServer implements HttpRequestHandler {
         return true;
     }
 
-    private String getCmdClassName(String cmdName) {
-        String cmdClassName = null;
-        for (APIAccessChecker apiChecker : _apiAccessCheckers){
-            cmdClassName = apiChecker.getApiCommands().getProperty(cmdName);
-            // Break on the first non-null value
-            if (cmdClassName != null)
-                return cmdClassName;
-        }
-        return null;
+    private Class<?> getCmdClass(String cmdName) {
+        return _apiNameCmdClassMap.get(cmdName);
     }
 
     // FIXME: rather than isError, we might was to pass in the status code to give more flexibility
@@ -939,7 +945,7 @@ public class ApiServer implements HttpRequestHandler {
 
     public String getSerializedApiError(int errorCode, String errorText, Map<String, Object[]> apiCommandParams, String responseType, Exception ex) {
         String responseName = null;
-        String cmdClassName = null;
+        Class<?> cmdClass = null;
         String responseText = null;
 
         try {
@@ -950,10 +956,9 @@ public class ApiServer implements HttpRequestHandler {
                 // cmd name can be null when "command" parameter is missing in the request
                 if (cmdObj != null) {
                     String cmdName = ((String[]) cmdObj)[0];
-                    cmdClassName = getCmdClassName(cmdName);
-                    if (cmdClassName != null) {
-                        Class<?> claz = Class.forName(cmdClassName);
-                        responseName = ((BaseCmd) claz.newInstance()).getCommandName();
+                    cmdClass = getCmdClass(cmdName);
+                    if (cmdClass != null) {
+                        responseName = ((BaseCmd) cmdClass.newInstance()).getCommandName();
                     } else {
                         responseName = "errorresponse";
                     }