package org.rhq.enterprise.server.rest.reporting;
import java.io.IOException;
import java.io.OutputStream;
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.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
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;
import static org.rhq.core.domain.util.PageOrdering.ASC;
import static org.rhq.enterprise.server.rest.reporting.ReportFormatHelper.cleanForCSV;
import static org.rhq.enterprise.server.rest.reporting.ReportFormatHelper.formatDateTime;
@Interceptors(ReportsInterceptor.class)
@Stateless
public class ConfigurationHistoryHandler extends AbstractRestBean implements ConfigurationHistoryLocal {
private final Log log = LogFactory.getLog(ConfigurationHistoryHandler.class);
@EJB
private ConfigurationManagerLocal configurationManager;
@Override
public StreamingOutput configurationHistory(final HttpServletRequest request) {
return configurationHistoryInternal(request,caller);
}
@Override
public StreamingOutput configurationHistoryInternal(final HttpServletRequest request, Subject user) {
this.caller = user;
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 ResourceConfigurationUpdateCriteria criteria = new ResourceConfigurationUpdateCriteria();
criteria.fetchConfiguration(true);
criteria.addSortCreatedTime(ASC);
CriteriaQueryExecutor<ResourceConfigurationUpdate, ResourceConfigurationUpdateCriteria> queryExecutor =
new CriteriaQueryExecutor<ResourceConfigurationUpdate, ResourceConfigurationUpdateCriteria>() {
@Override
public PageList<ResourceConfigurationUpdate> execute(ResourceConfigurationUpdateCriteria criteria) {
return configurationManager.findResourceConfigurationUpdatesByCriteria(caller, criteria);
}
};
CriteriaQuery<ResourceConfigurationUpdate, ResourceConfigurationUpdateCriteria> query =
new CriteriaQuery<ResourceConfigurationUpdate, ResourceConfigurationUpdateCriteria>(criteria, queryExecutor);
stream.write((getHeader() + "\n").getBytes());
for (ResourceConfigurationUpdate alert : query) {
String record = toCSV(alert) + "\n";
stream.write(record.getBytes());
}
}
private String toCSV(ResourceConfigurationUpdate configurationUpdate) {
return configurationUpdate.getId() + ","
+ formatDateTime(configurationUpdate.getCreatedTime())+","
+ formatDateTime(configurationUpdate.getModifiedTime())+","
+ configurationUpdate.getStatus()+","
+ cleanForCSV(configurationUpdate.getResource().getName())+ ","
+ cleanForCSV(ReportFormatHelper.parseAncestry(configurationUpdate.getResource().getAncestry())) + ","
+ getDetailsURL(configurationUpdate);
//@todo: check dates, user, update-type
}
private String getHeader(){
return "Version,Date Submitted,Date Completed,Status,Name,Ancestry,Details URL";
}
private String getDetailsURL(ResourceConfigurationUpdate configUpdate) {
String protocol;
if (request.isSecure()) {
protocol = "https";
} else {
protocol = "http";
}
return protocol + "://" + request.getServerName() + ":" + request.getServerPort() +
"/coregui/#Resource/" + configUpdate.getResource().getId() + "/Configuration/History/" +
configUpdate.getId();
}
};
}
}