package ro.nextreports.server.web.core.audit.list;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ro.nextreports.engine.exporter.util.TableData;
import ro.nextreports.server.StorageConstants;
import ro.nextreports.server.domain.Analysis;
import ro.nextreports.server.domain.Chart;
import ro.nextreports.server.domain.DashboardState;
import ro.nextreports.server.domain.DataSource;
import ro.nextreports.server.domain.Entity;
import ro.nextreports.server.domain.Report;
import ro.nextreports.server.domain.SchedulerJob;
import ro.nextreports.server.exception.NotFoundException;
import ro.nextreports.server.schedule.ScheduleConstants;
import ro.nextreports.server.service.StorageService;
import ro.nextreports.server.web.common.form.FormContentPanel;
import ro.nextreports.server.web.common.form.FormPanel;
import ro.nextreports.server.web.core.audit.InnerReport;
import ro.nextreports.server.web.core.audit.rights.AuditRights;
public class ListPanel extends FormContentPanel<AuditList> {
private static final Logger LOG = LoggerFactory.getLogger(ListPanel.class);
@SpringBean
private StorageService storageService;
private AuditList auditList;
public ListPanel() {
super(FormPanel.CONTENT_ID);
setOutputMarkupId(true);
auditList = new AuditList();
setModel(new CompoundPropertyModel<AuditList>(auditList));
IChoiceRenderer<String> entitiesRenderer = new ChoiceRenderer<String>() {
@Override
public Object getDisplayValue(String object) {
return getString("Section.Audit.Entity." + object);
}
public String getIdValue(String object, int index) {
return object;
}
};
final DropDownChoice<String> typeChoice = new DropDownChoice<String>("entityType", new Model(new ArrayList(AuditRights.ENTITIES)), entitiesRenderer);
typeChoice.setRequired(true);
typeChoice.setNullValid(false);
typeChoice.setOutputMarkupId(true);
add(typeChoice);
}
public AuditList getAuditList() {
return auditList;
}
protected TableData getResults(AuditList auditList) {
List<Entity> entities = new ArrayList<Entity>();
TableData result = new TableData();
if (auditList.getEntityType().equals(AuditRights.ENTITY_DATA_SOURCES)) {
try {
entities.addAll(Arrays.asList(storageService.getEntitiesByClassNameWithoutSecurity(
StorageConstants.DATASOURCES_ROOT, DataSource.class.getName())));
} catch (NotFoundException e) {
LOG.error(e.getMessage(), e);
}
} else if (auditList.getEntityType().equals(AuditRights.ENTITY_REPORTS)) {
try {
entities.addAll(Arrays.asList(storageService.getEntitiesByClassNameWithoutSecurity(
StorageConstants.REPORTS_ROOT, Report.class.getName())));
} catch (NotFoundException e) {
LOG.error(e.getMessage(), e);
}
} else if (auditList.getEntityType().equals(AuditRights.ENTITY_CHARTS)) {
try {
entities.addAll(Arrays.asList(storageService.getEntitiesByClassNameWithoutSecurity(
StorageConstants.CHARTS_ROOT, Chart.class.getName())));
} catch (NotFoundException e) {
LOG.error(e.getMessage(), e);
}
} else if (auditList.getEntityType().equals(AuditRights.ENTITY_SCHEDULERS)) {
try {
entities.addAll(Arrays.asList(storageService.getEntitiesByClassNameWithoutSecurity(
StorageConstants.SCHEDULER_ROOT, SchedulerJob.class.getName())));
} catch (NotFoundException e) {
LOG.error(e.getMessage(), e);
}
} else if (auditList.getEntityType().equals(AuditRights.ENTITY_DASHBOARDS)) {
try {
entities.addAll(Arrays.asList(storageService.getEntitiesByClassNameWithoutSecurity(
StorageConstants.DASHBOARDS_ROOT, DashboardState.class.getName())));
} catch (NotFoundException e) {
LOG.error(e.getMessage(), e);
}
} else if (auditList.getEntityType().equals(AuditRights.ENTITY_ANALYSIS)) {
try {
entities.addAll(Arrays.asList(storageService.getEntitiesByClassNameWithoutSecurity(
StorageConstants.ANALYSIS_ROOT, Analysis.class.getName())));
} catch (NotFoundException e) {
LOG.error(e.getMessage(), e);
}
}
Collections.sort(entities, new Comparator<Entity>() {
@Override
public int compare(Entity o1, Entity o2) {
return o1.getPath().compareTo(o2.getPath());
}
});
if (auditList.getEntityType().equals(AuditRights.ENTITY_DATA_SOURCES) ||
auditList.getEntityType().equals(AuditRights.ENTITY_REPORTS) ||
auditList.getEntityType().equals(AuditRights.ENTITY_CHARTS) ||
auditList.getEntityType().equals(AuditRights.ENTITY_DASHBOARDS)) {
List<String> header = Arrays.asList(getString("Section.Audit.Rights.name"),
getString("Section.Audit.Rights.path"),
getString("ActionContributor.Search.entityCreated"),
getString("ActionContributor.Search.entityCreation"),
getString("ActionContributor.Search.entityModified"),
getString("ActionContributor.Search.entityModification"));
result.setHeader(header);
for (Iterator<Entity> it = entities.iterator(); it.hasNext();) {
Entity entity = it.next();
List<Object> row = new ArrayList<Object>();
row.add(entity.getName());
row.add(entity.getPath());
row.add(entity.getCreatedBy());
row.add(entity.getCreatedDate());
row.add(entity.getLastUpdatedBy());
row.add(entity.getLastUpdatedDate());
result.getData().add(row);
}
} else if (auditList.getEntityType().equals(AuditRights.ENTITY_SCHEDULERS)) {
List<String> header = Arrays.asList(getString("Section.Audit.Rights.name"),
getString("ActionContributor.Search.entityType"),
getString("Section.Audit.Run.report"),
getString("ActionContributor.Search.entityActive"),
getString("ActionContributor.Search.entityNextRun"),
getString("ActionContributor.Run.export"));
result.setHeader(header);
for (Iterator<Entity> it = entities.iterator(); it.hasNext();) {
SchedulerJob entity = (SchedulerJob)it.next();
List<Object> row = new ArrayList<Object>();
row.add(entity.getName());
row.add(entity.getTime().getType());
row.add(entity.getReport().getPath());
row.add(isActive(entity));
row.add(entity.getNextRun());
row.add(entity.getReportRuntime().getOutputType());
result.getData().add(row);
}
} else if (auditList.getEntityType().equals(AuditRights.ENTITY_ANALYSIS)) {
List<String> header = Arrays.asList(getString("Section.Audit.Rights.name"),
getString("Table"),
getString("freeze"),
getString("ActionContributor.Search.entityCreated"),
getString("ActionContributor.Search.entityCreation"),
getString("ActionContributor.Search.entityModified"),
getString("ActionContributor.Search.entityModification"));
result.setHeader(header);
for (Iterator<Entity> it = entities.iterator(); it.hasNext();) {
Analysis entity = (Analysis)it.next();
List<Object> row = new ArrayList<Object>();
row.add(entity.getName());
row.add(entity.getTableName());
row.add(entity.isFreezed());
row.add(entity.getCreatedBy());
row.add(entity.getCreatedDate());
row.add(entity.getLastUpdatedBy());
row.add(entity.getLastUpdatedDate());
result.getData().add(row);
}
}
return result;
}
private boolean isActive(SchedulerJob job) {
boolean active;
Date now = new Date();
if (ScheduleConstants.ONCE_TYPE.equals(job.getTime().getType())) {
active = job.getTime().getRunDate().compareTo(now) >= 0;
} else {
active = (job.getTime().getStartActivationDate().compareTo(now) <= 0) &&
(job.getTime().getEndActivationDate().compareTo(now) >= 0);
}
return active;
}
protected String getTitle() {
StringBuilder sb = new StringBuilder(InnerReport.LIST.name());
sb.append(" ( ");
sb.append(getString("Section.Audit.Rights.entities"));
sb.append(" = ");
sb.append(auditList.getEntityType());
sb.append(" )");
return sb.toString();
}
}