package org.rhq.enterprise.server.rest.reporting;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.StreamingOutput;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
import org.rhq.enterprise.server.rest.AbstractRestBean;
import org.rhq.enterprise.server.rest.ReportsInterceptor;
import org.rhq.enterprise.server.util.CriteriaQuery;
import org.rhq.enterprise.server.util.CriteriaQueryExecutor;
@Interceptors(ReportsInterceptor.class)
@Stateless
public class RecentOperationsHandler extends AbstractRestBean implements RecentOperationsLocal {
private final Log log = LogFactory.getLog(RecentOperationsHandler.class);
@EJB
private OperationManagerLocal operationManager;
public StreamingOutput recentOperationsInternal(
String operationRequestStatus,
Long startTime,
Long endTime,
HttpServletRequest request,
Subject user) {
this.caller = user;
return recentOperations(operationRequestStatus,startTime,endTime,request);
}
@Override
public StreamingOutput recentOperations(final String operationRequestStatus, final Long startTime,
final Long endTime, final HttpServletRequest request) {
if (log.isDebugEnabled()) {
log.debug("Received request to generate report for " + caller);
}
return new StreamingOutput() {
@Override
public void write(OutputStream stream) throws IOException, WebApplicationException {
final ResourceOperationHistoryCriteria criteria = new ResourceOperationHistoryCriteria();
criteria.addSortEndTime(PageOrdering.DESC);
if(startTime != null){
criteria.addFilterStartTime(startTime);
}
if(endTime != null){
criteria.addFilterEndTime(endTime);
}
// lets default the end time for them to now if they didn't enter it
if(startTime != null && endTime == null){
Date today = new Date();
criteria.addFilterEndTime(today.getTime());
}
List<OperationRequestStatus> operationRequestStatusList = new ArrayList<OperationRequestStatus>(10);
String statuses[] = operationRequestStatus.split(",");
for (String requestStatus : statuses) {
log.info("OperationRequestStatus Filter set for: " + requestStatus);
operationRequestStatusList.add(OperationRequestStatus.valueOf(requestStatus.toUpperCase()));
}
criteria.addFilterStatuses(operationRequestStatusList.toArray(new OperationRequestStatus[operationRequestStatusList.size()]));
CriteriaQueryExecutor<ResourceOperationHistory, ResourceOperationHistoryCriteria> queryExecutor =
new CriteriaQueryExecutor<ResourceOperationHistory, ResourceOperationHistoryCriteria>() {
@Override
public PageList<ResourceOperationHistory> execute(ResourceOperationHistoryCriteria criteria) {
return operationManager.findResourceOperationHistoriesByCriteria(caller, criteria);
}
};
CriteriaQuery<ResourceOperationHistory, ResourceOperationHistoryCriteria> query =
new CriteriaQuery<ResourceOperationHistory, ResourceOperationHistoryCriteria>(criteria, queryExecutor);
CsvWriter<ResourceOperationHistory> csvWriter = new CsvWriter<ResourceOperationHistory>();
csvWriter.setColumns("startedTime", "operationDefinition.displayName", "subjectName", "status",
"resource.name", "ancestry", "detailsURL");
csvWriter.setPropertyConverter("startedTime", csvWriter.DATE_CONVERTER);
csvWriter.setPropertyConverter("ancestry", new PropertyConverter<ResourceOperationHistory>() {
@Override
public Object convert(ResourceOperationHistory history, String propertyName) {
return ReportFormatHelper.parseAncestry(history.getResource().getAncestry());
}
});
csvWriter.setPropertyConverter("detailsURL", new PropertyConverter<ResourceOperationHistory>() {
@Override
public Object convert(ResourceOperationHistory history, String propertyName) {
return getDetailsURL(history);
}
});
stream.write((getHeader() + "\n").getBytes());
for (ResourceOperationHistory history : query) {
csvWriter.write(history, stream);
}
}
private String getHeader(){
return "Date Submitted,Operation,Requester,Status,Resource,Ancestry,Details URL";
}
private String getDetailsURL(ResourceOperationHistory history) {
String protocol;
if (request.isSecure()) {
protocol = "https";
} else {
protocol = "http";
}
return protocol + "://" + request.getServerName() + ":" + request.getServerPort() +
"/coregui/#Resource/" + history.getResource().getId() + "/Operations/History/" +
history.getId();
}
};
}
}