From 4bb71d2a0c222f2c5bc8c3674574a1962ba1a14e Mon Sep 17 00:00:00 2001 From: Kris McQueen Date: Mon, 30 Aug 2010 11:54:30 -0700 Subject: [PATCH] Refactor listEvents API to new framework. --- .../com/cloud/api/commands/ListEventsCmd.java | 190 ++++-------------- .../com/cloud/api/response/EventResponse.java | 130 ++++++++++++ .../com/cloud/server/ManagementServer.java | 3 +- .../cloud/server/ManagementServerImpl.java | 118 +++++------ 4 files changed, 230 insertions(+), 211 deletions(-) create mode 100644 server/src/com/cloud/api/response/EventResponse.java diff --git a/server/src/com/cloud/api/commands/ListEventsCmd.java b/server/src/com/cloud/api/commands/ListEventsCmd.java index 089aca5577a..66777a06596 100644 --- a/server/src/com/cloud/api/commands/ListEventsCmd.java +++ b/server/src/com/cloud/api/commands/ListEventsCmd.java @@ -21,42 +21,21 @@ package com.cloud.api.commands; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; import org.apache.log4j.Logger; -import com.cloud.api.BaseCmd; +import com.cloud.api.BaseListCmd; +import com.cloud.api.Implementation; import com.cloud.api.Parameter; -import com.cloud.api.ServerApiException; -import com.cloud.domain.DomainVO; +import com.cloud.api.response.EventResponse; import com.cloud.event.EventVO; -import com.cloud.server.Criteria; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.utils.Pair; - -public class ListEventsCmd extends BaseCmd { +import com.cloud.serializer.SerializerHelper; + +@Implementation(method="searchForEvents") +public class ListEventsCmd extends BaseListCmd { public static final Logger s_logger = Logger.getLogger(ListEventsCmd.class.getName()); private static final String s_name = "listeventsresponse"; - private static final List> s_properties = new ArrayList>(); - - static { - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.DURATION, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.END_DATE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.ENTRY_TIME, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.LEVEL, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.START_DATE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.TYPE, Boolean.FALSE)); - - s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); - } ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// @@ -77,6 +56,9 @@ public class ListEventsCmd extends BaseCmd { @Parameter(name="entrytime", type=CommandType.INTEGER) private Integer entryTime; + @Parameter(name="level", type=CommandType.STRING) + private String level; + @Parameter(name="startdate", type=CommandType.DATE) private Date startDate; @@ -108,6 +90,10 @@ public class ListEventsCmd extends BaseCmd { return entryTime; } + public String getLevel() { + return level; + } + public Date getStartDate() { return startDate; } @@ -120,127 +106,39 @@ public class ListEventsCmd extends BaseCmd { /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// + @Override public String getName() { return s_name; - } - public List> getProperties() { - return s_properties; - } - - @Override - public List> execute(Map params) { - Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); - String accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName()); - Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); - String eventType = (String)params.get(BaseCmd.Properties.TYPE.getName()); - String eventLevel = (String)params.get(BaseCmd.Properties.LEVEL.getName()); -// String eventLevel = (String)params.get(BaseCmd.Properties.DESCRIPTION.getName()); - Date startDate = (Date)params.get(BaseCmd.Properties.START_DATE.getName()); - Date endDate = (Date)params.get(BaseCmd.Properties.END_DATE.getName()); - String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); - Integer entryTime = (Integer)params.get(BaseCmd.Properties.ENTRY_TIME.getName()); - Integer duration = (Integer)params.get(BaseCmd.Properties.DURATION.getName()); - Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); - Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName()); - boolean isAdmin = false; - - Long[] accountIds = null; - Long accountId = null; - if ((account == null) || isAdmin(account.getType())) { - isAdmin = true; - // validate domainId before proceeding - if (domainId != null) { - if ((account != null) && !getManagementServer().isChildDomain(account.getDomainId(), domainId)) { - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list events."); - } - if (accountName != null) { - Account userAccount = getManagementServer().findAccountByName(accountName, domainId); - if (userAccount != null) { - accountId = userAccount.getId(); - } else { - throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find account " + accountName + " in domain " + domainId); - } - } - } else { - domainId = ((account == null) ? DomainVO.ROOT_DOMAIN : account.getDomainId()); - } - } else { - accountId = account.getId(); - } - - if (accountId != null) { - accountIds = new Long[1]; - accountIds[0] = accountId; - } - - Long startIndex = Long.valueOf(0); - int pageSizeNum = 50; - if (pageSize != null) { - pageSizeNum = pageSize.intValue(); - } - if (page != null) { - int pageNum = page.intValue(); - if (pageNum > 0) { - startIndex = Long.valueOf(pageSizeNum * (pageNum-1)); - } - } - Criteria c = new Criteria("createDate", Boolean.FALSE, startIndex, Long.valueOf(pageSizeNum)); - c.addCriteria(Criteria.ACCOUNTID, accountIds); - if (keyword != null) { - c.addCriteria(Criteria.KEYWORD, keyword); - } else { - if (isAdmin) { - c.addCriteria(Criteria.DOMAINID, domainId); - } - c.addCriteria(Criteria.TYPE, eventType); - c.addCriteria(Criteria.LEVEL, eventLevel); - c.addCriteria(Criteria.STARTDATE, startDate); - c.addCriteria(Criteria.ENDDATE, endDate); - } + } - List events; - - if(entryTime != null && duration != null){ - if(entryTime <= duration){ - throw new ServerApiException(BaseCmd.PARAM_ERROR, "Entry time shoule be greater than duration"); - } - events = getManagementServer().listPendingEvents(entryTime, duration); + @Override @SuppressWarnings("unchecked") + public String getResponse() { + List events = (List)getResponseObject(); + + List response = new ArrayList(); + for (EventVO event : events) { + EventResponse responseEvent = new EventResponse(); + responseEvent.setAccountName(event.getAccountName()); + responseEvent.setCreated(event.getCreateDate()); + responseEvent.setDescription(event.getDescription()); + responseEvent.setDomainId(event.getDomainId()); + responseEvent.setEventType(event.getType()); + responseEvent.setId(event.getId()); + responseEvent.setLevel(event.getLevel()); + responseEvent.setParentId(event.getStartId()); + responseEvent.setState(event.getState()); + // TODO: implement +// responseEvent.setDomainName(event.getDomainName()); +// eventData.add(new Pair(BaseCmd.Properties.DOMAIN.getName(), getManagementServer().findDomainIdById(acct.getDomainId()).getName())); +// responseEvent.setUsername(event.getUserId()); +// User user = getManagementServer().findUserById(event.getUserId()); +// if (user != null) { +// eventData.add(new Pair(BaseCmd.Properties.USERNAME.getName(), user.getUsername() )); +// } + + response.add(responseEvent); } - else { - events = getManagementServer().searchForEvents(c); - } - - if (events == null) { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching for events"); - } - List> eventTags = new ArrayList>(); - Object[] eTag = new Object[events.size()]; - int i = 0; - for (EventVO event : events) { - List> eventData = new ArrayList>(); - eventData.add(new Pair(BaseCmd.Properties.ID.getName(), (new Long(event.getId())).toString())); - User user = getManagementServer().findUserById(event.getUserId()); - if (user != null) { - eventData.add(new Pair(BaseCmd.Properties.USERNAME.getName(), user.getUsername() )); - } - eventData.add(new Pair(BaseCmd.Properties.TYPE.getName(), event.getType())); - eventData.add(new Pair(BaseCmd.Properties.LEVEL.getName(), event.getLevel())); - eventData.add(new Pair(BaseCmd.Properties.DESCRIPTION.getName(), event.getDescription())); - Account acct = getManagementServer().findAccountById(Long.valueOf(event.getAccountId())); - if (acct != null) { - eventData.add(new Pair(BaseCmd.Properties.ACCOUNT.getName(), acct.getAccountName())); - eventData.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), acct.getDomainId().toString())); - eventData.add(new Pair(BaseCmd.Properties.DOMAIN.getName(), getManagementServer().findDomainIdById(acct.getDomainId()).getName())); - } - if (event.getCreateDate() != null) { - eventData.add(new Pair(BaseCmd.Properties.CREATED.getName(), getDateString(event.getCreateDate()))); - } - eventData.add(new Pair(BaseCmd.Properties.STATE.getName(), event.getState().toString())); - eventData.add(new Pair(BaseCmd.Properties.PARENT_ID.getName(), (new Long(event.getStartId())).toString())); - eTag[i++] = eventData; - } - Pair eventTag = new Pair("event", eTag); - eventTags.add(eventTag); - return eventTags; + + return SerializerHelper.toSerializedString(response); } } diff --git a/server/src/com/cloud/api/response/EventResponse.java b/server/src/com/cloud/api/response/EventResponse.java new file mode 100644 index 00000000000..68052858fee --- /dev/null +++ b/server/src/com/cloud/api/response/EventResponse.java @@ -0,0 +1,130 @@ +package com.cloud.api.response; + +import java.util.Date; + +import com.cloud.api.ResponseObject; +import com.cloud.event.EventState; +import com.cloud.serializer.Param; + +public class EventResponse implements ResponseObject { + @Param(name="id") + private Long id; + + @Param(name="username") + private String username; + + @Param(name="type") + private String eventType; + + @Param(name="level") + private String level; + + @Param(name="description") + private String description; + + @Param(name="account") + private String accountName; + + @Param(name="domainid") + private Long domainId; + + @Param(name="domain") + private String domainName; + + @Param(name="created") + private Date created; + + @Param(name="state") + private EventState state; + + @Param(name="parentid") + private Long parentId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public String getLevel() { + return level; + } + + public void setLevel(String level) { + this.level = level; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public Long getDomainId() { + return domainId; + } + + public void setDomainId(Long domainId) { + this.domainId = domainId; + } + + public String getDomainName() { + return domainName; + } + + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public EventState getState() { + return state; + } + + public void setState(EventState state) { + this.state = state; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } +} diff --git a/server/src/com/cloud/server/ManagementServer.java b/server/src/com/cloud/server/ManagementServer.java index a8bab6de7e6..f4a22a8ed75 100644 --- a/server/src/com/cloud/server/ManagementServer.java +++ b/server/src/com/cloud/server/ManagementServer.java @@ -38,6 +38,7 @@ import com.cloud.api.commands.ListCfgsByCmd; import com.cloud.api.commands.ListClustersCmd; import com.cloud.api.commands.ListDiskOfferingsCmd; import com.cloud.api.commands.ListDomainsCmd; +import com.cloud.api.commands.ListEventsCmd; import com.cloud.api.commands.LockAccountCmd; import com.cloud.api.commands.LockUserCmd; import com.cloud.api.commands.RebootSystemVmCmd; @@ -1173,7 +1174,7 @@ public interface ManagementServer { * @param c * @return List of Events. */ - List searchForEvents(Criteria c); + List searchForEvents(ListEventsCmd c) throws PermissionDeniedException, InvalidParameterValueException; List listPendingEvents(int entryTime, int duration); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 6676e8245b2..e330156b3ba 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -77,6 +77,7 @@ import com.cloud.api.commands.ListCfgsByCmd; import com.cloud.api.commands.ListClustersCmd; import com.cloud.api.commands.ListDiskOfferingsCmd; import com.cloud.api.commands.ListDomainsCmd; +import com.cloud.api.commands.ListEventsCmd; import com.cloud.api.commands.LockAccountCmd; import com.cloud.api.commands.LockUserCmd; import com.cloud.api.commands.PrepareForMaintenanceCmd; @@ -4243,10 +4244,6 @@ public class ManagementServerImpl implements ManagementServer { return _configMgr.changePrivateIPRange(add, podId, startIP, endIP); } - private List findUsersLike(String username) { - return _userDao.findUsersLike(username); - } - @Override public User findUserById(Long userId) { return _userDao.findById(userId); @@ -5104,37 +5101,65 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List searchForEvents(Criteria c) { - Filter searchFilter = new Filter(EventVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); + public List searchForEvents(ListEventsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException { + Account account = (Account)UserContext.current().getAccountObject(); + Long accountId = null; + boolean isAdmin = false; + String accountName = cmd.getAccountName(); + Long domainId = cmd.getDomainId(); - Object[] userIds = (Object[]) c.getCriteria(Criteria.USERID); - Object[] accountIds = (Object[]) c.getCriteria(Criteria.ACCOUNTID); - Object username = c.getCriteria(Criteria.USERNAME); - Object accountName = c.getCriteria(Criteria.ACCOUNTNAME); - Object type = c.getCriteria(Criteria.TYPE); - Object level = c.getCriteria(Criteria.LEVEL); -// Object description = c.getCriteria(Criteria.DESCRIPTION); - Date startDate = (Date) c.getCriteria(Criteria.STARTDATE); - Date endDate = (Date) c.getCriteria(Criteria.ENDDATE); - Object domainId = c.getCriteria(Criteria.DOMAINID); - Object keyword = c.getCriteria(Criteria.KEYWORD); + if ((account == null) || isAdmin(account.getType())) { + isAdmin = true; + // validate domainId before proceeding + if (domainId != null) { + if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { + throw new PermissionDeniedException("Invalid domain id (" + domainId + ") given, unable to list events."); + } + + if (accountName != null) { + Account userAccount = _accountDao.findActiveAccount(accountName, domainId); + if (userAccount != null) { + accountId = userAccount.getId(); + } else { + throw new ServerApiException(BaseCmd.ACCOUNT_ERROR, "Unable to find account " + accountName + " in domain " + domainId); + } + } + } else { + domainId = ((account == null) ? DomainVO.ROOT_DOMAIN : account.getDomainId()); + } + } else { + accountId = account.getId(); + } + + Filter searchFilter = new Filter(EventVO.class, "createDate", false, cmd.getStartIndex(), cmd.getPageSizeVal()); + + Object type = cmd.getType(); + Object level = cmd.getLevel(); + Date startDate = cmd.getStartDate(); + Date endDate = cmd.getEndDate(); + Object keyword = cmd.getKeyword(); + Integer entryTime = cmd.getEntryTime(); + Integer duration = cmd.getDuration(); + + if ((entryTime != null) && (duration != null)) { + if (entryTime <= duration){ + throw new InvalidParameterValueException("Entry time must be greater than duration"); + } + return listPendingEvents(entryTime, duration); + } SearchBuilder sb = _eventDao.createSearchBuilder(); sb.and("levelL", sb.entity().getLevel(), SearchCriteria.Op.LIKE); - sb.and("userIdEQ", sb.entity().getUserId(), SearchCriteria.Op.EQ); - sb.and("userIdIN", sb.entity().getUserId(), SearchCriteria.Op.IN); - sb.and("accountIdEQ", sb.entity().getAccountId(), SearchCriteria.Op.EQ); - sb.and("accountIdIN", sb.entity().getAccountId(), SearchCriteria.Op.IN); + sb.and("levelEQ", sb.entity().getLevel(), SearchCriteria.Op.EQ); + sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.LIKE); sb.and("domainIdEQ", sb.entity().getDomainId(), SearchCriteria.Op.EQ); sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); - sb.and("levelEQ", sb.entity().getLevel(), SearchCriteria.Op.EQ); -// sb.and("description", sb.entity().getDescription(), SearchCriteria.Op.LIKE); sb.and("createDateB", sb.entity().getCreateDate(), SearchCriteria.Op.BETWEEN); sb.and("createDateG", sb.entity().getCreateDate(), SearchCriteria.Op.GTEQ); sb.and("createDateL", sb.entity().getCreateDate(), SearchCriteria.Op.LTEQ); - if ((accountIds == null) && (accountName == null) && (domainId != null)) { + if ((accountId == null) && (accountName == null) && (domainId != null) && isAdmin) { // if accountId isn't specified, we can do a domain match for the admin case SearchBuilder domainSearch = _domainDao.createSearchBuilder(); domainSearch.and("path", domainSearch.entity().getPath(), SearchCriteria.Op.LIKE); @@ -5150,58 +5175,23 @@ public class ManagementServerImpl implements ManagementServer { sc.addAnd("level", SearchCriteria.Op.SC, ssc); } - -// if (keyword != null) { -// sc.setParameters("levelL", "%" + keyword + "%"); -// } else if (level != null) { -// sc.setParameters("levelEQ", level); -// } - -// if (description != null) { -// sc.setParameters("description", "%" + description + "%"); -// } - if(level!=null) + if (level != null) sc.setParameters("levelEQ", level); - if (userIds == null && username != null) { - List users = findUsersLike((String) username); - if (users == null || users.size() == 0) { - return new ArrayList(); - } - userIds = new Long[users.size()]; - for (int i = 0; i < users.size(); i++) { - userIds[i] = users.get(i).getId(); - } - } - - if (userIds != null) { - if (userIds.length == 1) { - if ((userIds[0] != null) && !((Long) userIds[0]).equals(Long.valueOf(-1))) { - sc.setParameters("userIdEQ", userIds[0]); - } - } else { - sc.setParameters("userIdIN", userIds); - } - } - if (accountIds != null) { - if (accountIds.length == 1) { - if ((accountIds[0] != null) && !((Long) accountIds[0]).equals(Long.valueOf(-1))) { - sc.setParameters("accountIdEQ", accountIds[0]); - } - } else { - sc.setParameters("accountIdIN", accountIds); - } + if (accountId != null) { + sc.setParameters("accountId", accountId); } else if (domainId != null) { if (accountName != null) { sc.setParameters("domainIdEQ", domainId); sc.setParameters("accountName", "%" + accountName + "%"); sc.addAnd("removed", SearchCriteria.Op.NULL); - } else { + } else if (isAdmin) { DomainVO domain = _domainDao.findById((Long)domainId); sc.setJoinParameters("domainSearch", "path", domain.getPath() + "%"); } } + if (type != null) { sc.setParameters("type", type); }