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";
}