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.alert.AlertDefinition;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.AlertDefinitionCriteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
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 AlertDefinitionHandler extends AbstractRestBean implements AlertDefinitionLocal {
private final Log log = LogFactory.getLog(AlertDefinitionHandler.class);
@EJB
private AlertDefinitionManagerLocal alertDefinitionManager;
@EJB
ResourceManagerLocal resourceManager;
@Override
public StreamingOutput alertDefinitions(final HttpServletRequest request) {
return alertDefinitionsInternal(request, caller);
}
public StreamingOutput alertDefinitionsInternal(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 AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
criteria.addFilterResourceOnly(true);
criteria.fetchGroupAlertDefinition(true);
criteria.fetchResource(true);
// TODO figure out why resourceType is not getting fetched
// The resource type id is needed for the parent url when we have a
// template alert definition. I previously tried accessing the resource
// type id via AlertDefinition.resourceType.id, but resourceType is null
// even though fetchResourceType is set to true in the critera.
//
// jsanda
criteria.fetchResourceType(true);
CriteriaQueryExecutor<AlertDefinition, AlertDefinitionCriteria> queryExecutor =
new CriteriaQueryExecutor<AlertDefinition, AlertDefinitionCriteria>() {
@Override
public PageList<AlertDefinition> execute(AlertDefinitionCriteria criteria) {
return alertDefinitionManager.findAlertDefinitionsByCriteria(caller, criteria);
}
};
CriteriaQuery<AlertDefinition, AlertDefinitionCriteria> query =
new CriteriaQuery<AlertDefinition, AlertDefinitionCriteria>(criteria, queryExecutor);
CsvWriter<AlertDefinition> csvWriter = new CsvWriter<AlertDefinition>();
csvWriter.setColumns("name", "description", "enabled", "priority", "parent", "ancestry",
"detailsURL");
csvWriter.setPropertyConverter("parent", new PropertyConverter<AlertDefinition>() {
@Override
public Object convert(AlertDefinition alertDef, String propertyName) {
return getParentURL(alertDef);
}
});
csvWriter.setPropertyConverter("ancestry", new PropertyConverter<AlertDefinition>() {
@Override
public Object convert(AlertDefinition alertDef, String propertyName) {
return ReportFormatHelper.parseAncestry(alertDef.getResource().getAncestry());
}
});
csvWriter.setPropertyConverter("detailsURL", new PropertyConverter<AlertDefinition>() {
@Override
public Object convert(AlertDefinition alertDef, String propertyName) {
return getDetailsURL(alertDef);
}
});
stream.write((getHeader() + "\n").getBytes());
for (AlertDefinition alertDef : query) {
csvWriter.write(alertDef, stream);
}
}
private String getParentURL(AlertDefinition alertDef) {
Integer templateId = alertDef.getParentId();
if (templateId != null && templateId > 0) {
return getBaseURL() + "/#Administration/Configuration/AlertDefTemplates/" +
alertDef.getResource().getResourceType().getId() + "/" + templateId;
} else if (alertDef.getGroupAlertDefinition() != null) {
return getBaseURL() + "/#ResourceGroup/" + alertDef.getGroupAlertDefinition().getGroup().getId()
+ "/Alerts/Definitions/" +
alertDef.getGroupAlertDefinition().getId();
} else {
return "";
}
}
private String getHeader(){
return "Name,Description,Enabled,Priority,Parent,Ancestry,Details URL";
}
private String getDetailsURL(AlertDefinition alertDef) {
return getBaseURL() + "/#Resource/" + alertDef.getResource().getId() + "/Alerts/Definitions/" +
alertDef.getId();
}
private String getBaseURL() {
String protocol;
if (request.isSecure()) {
protocol = "https";
} else {
protocol = "http";
}
return protocol + "://" + request.getServerName() + ":" + request.getServerPort() + "/coregui";
}
};
}
}