ApiServer: Don't depend on plugin for apiname:cmd class mapping Signed-off-by: Rohit Yadav <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/657fb6ac Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/657fb6ac Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/657fb6ac Branch: refs/heads/master Commit: 657fb6ac0becd99ea7a1e99e0423c12e9657d0ae Parents: 3dc7626 Author: Rohit Yadav <[email protected]> Authored: Wed Jan 9 17:19:14 2013 -0800 Committer: Rohit Yadav <[email protected]> Committed: Wed Jan 9 17:20:46 2013 -0800 ---------------------------------------------------------------------- server/src/com/cloud/api/ApiServer.java | 22 ++++++++++------------ 1 files changed, 10 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/657fb6ac/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 dfb47fa..519908d 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -60,7 +60,6 @@ import org.apache.cloudstack.api.command.user.event.ListEventsCmd; import org.apache.cloudstack.api.command.user.vm.ListVMsCmd; import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd; import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd; -import org.apache.cloudstack.discovery.ApiDiscoveryService; import org.apache.commons.codec.binary.Base64; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.ConnectionClosedException; @@ -134,8 +133,6 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CSExceptionErrorCode; import com.cloud.uuididentity.dao.IdentityDao; -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()); @@ -150,15 +147,13 @@ public class ApiServer implements HttpRequestHandler { @Inject(adapter = APIAccessChecker.class) protected Adapters<APIAccessChecker> _apiAccessCheckers; - @Inject(adapter = ApiDiscoveryService.class) - protected Adapters<ApiDiscoveryService> _apiDiscoveryServices; private Account _systemAccount = null; private User _systemUser = null; 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 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")); @@ -202,13 +197,16 @@ public class ApiServer implements HttpRequestHandler { } } - for (ApiDiscoveryService discoveryService: _apiDiscoveryServices) { - _apiNameCmdClassMap.putAll(discoveryService.getApiNameCmdClassMapping()); - } + Set<Class<?>> cmdClasses = ReflectUtil.getClassesWithAnnotation(APICommand.class, + new String[]{"org.apache.cloudstack.api", "com.cloud.api"}); - if (_apiNameCmdClassMap.size() == 0) { - s_logger.fatal("ApiServer failed to generate apiname, cmd class mappings." - + "Please check and enable at least one ApiDiscovery adapter."); + for(Class<?> cmdClass: cmdClasses) { + String apiName = cmdClass.getAnnotation(APICommand.class).name(); + if (_apiNameCmdClassMap.containsKey(apiName)) { + s_logger.error("API Cmd class " + cmdClass.getName() + " has non-unique apiname" + apiName); + continue; + } + _apiNameCmdClassMap.put(apiName, cmdClass); } encodeApiResponse = Boolean.valueOf(configDao.getValue(Config.EncodeApiResponse.key()));
