package ro.nextreports.server.web.core.audit.run; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.datetime.StyleDateConverter; import org.apache.wicket.datetime.markup.html.form.DateTextField; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.extensions.yui.calendar.DateField; import org.apache.wicket.extensions.yui.calendar.DatePicker; import org.apache.wicket.markup.head.IHeaderResponse; 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.markup.html.form.TextField; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.nextreports.engine.exporter.util.TableData; import ro.nextreports.engine.util.DateUtil; import ro.nextreports.server.StorageConstants; import ro.nextreports.server.domain.DateRange; import ro.nextreports.server.domain.Entity; import ro.nextreports.server.domain.RunReportHistory; import ro.nextreports.server.domain.User; import ro.nextreports.server.exception.NotFoundException; import ro.nextreports.server.service.ReportService; import ro.nextreports.server.service.SecurityService; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.util.StorageUtil; import ro.nextreports.server.web.common.behavior.SimpleTooltipBehavior; 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; import ro.nextreports.server.web.core.migration.AddEntityPanel; import ro.nextreports.server.web.core.migration.MigrationEntityType; public class RunPanel extends FormContentPanel<AuditRun> { private static final Logger LOG = LoggerFactory.getLogger(RunPanel.class); @SpringBean private StorageService storageService; @SpringBean private ReportService reportService; @SpringBean private SecurityService securityService; private AuditRun auditRun; private TextField pathField; private ModalWindow runDialog; public RunPanel() { super(FormPanel.CONTENT_ID); setOutputMarkupId(true); auditRun = new AuditRun(); setModel(new CompoundPropertyModel<AuditRun>(auditRun)); runDialog = new ModalWindow("runDialog"); add(runDialog); final DropDownChoice<String> ownerChoice = new DropDownChoice<String>("owner", getOwners()) { @Override protected String getNullKeyDisplayValue() { return "-- " + getString("Section.Audit.Run.status.all") + " --"; } }; ownerChoice.setOutputMarkupId(true); add(ownerChoice); IChoiceRenderer<String> renderer = new ChoiceRenderer<String>() { @Override public Object getDisplayValue(String object) { return getString("Section.Audit.Run.status." + object.toLowerCase()); } }; final DropDownChoice<String> statusChoice = new DropDownChoice<String>("status", AuditRun.STATUS_LIST, renderer); statusChoice.setNullValid(false); statusChoice.setOutputMarkupId(true); add(statusChoice); DateField startField = new DateField("startDate") { protected DateTextField newDateTextField(String s, PropertyModel propertyModel) { DateTextField dateField = DateTextField.withConverter(s, propertyModel,new StyleDateConverter("S-", false)); dateField.setLabel(new Model<String>(getString("Section.Audit.Run.start"))); return dateField; } protected DatePicker newDatePicker() { return new DatePicker() { private static final long serialVersionUID = 1L; @Override protected void configure(final Map<String, Object> widgetProperties, final IHeaderResponse response, final Map<String, Object> initVariables) { super.configure(widgetProperties, response, initVariables); } @Override protected boolean enableMonthYearSelection() { return true; } }; } }; startField.setRequired(true); add(startField); DateField endField = new DateField("endDate") { protected DateTextField newDateTextField(String s, PropertyModel propertyModel) { DateTextField dateField = DateTextField.withConverter(s, propertyModel, new StyleDateConverter("S-", false)); dateField.setLabel(new Model<String>(getString("Section.Audit.Run.end"))); return dateField; } protected DatePicker newDatePicker() { return new DatePicker() { private static final long serialVersionUID = 1L; @Override protected void configure(final Map<String, Object> widgetProperties, final IHeaderResponse response, final Map<String, Object> initVariables) { super.configure(widgetProperties, response, initVariables); } @Override protected boolean enableMonthYearSelection() { return true; } }; } }; endField.setRequired(true); add(endField); pathField = new TextField("path"); pathField.setOutputMarkupPlaceholderTag(true); add(pathField); AjaxLink addLink = new AjaxLink<Void>("addPath") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { runDialog.setTitle(getString("Settings.migration.export.entity.add")); runDialog.setInitialWidth(350); runDialog.setUseInitialHeight(false); AddEntityPanel addEntityPanel = new AddEntityPanel() { private static final long serialVersionUID = 1L; @Override public void onOk(AjaxRequestTarget target) { Iterator<Entity> entities = getEntities(); if (!entities.hasNext()) { error(getString("Settings.migration.export.entity.select")); target.add(getFeedbackPanel()); return; } Entity entity = entities.next(); String path = entity.getPath(); path = path.substring(StorageConstants.NEXT_SERVER_ROOT.length() + 1); auditRun.setPath(path); runDialog.close(target); target.add(pathField); } }; addEntityPanel.setRoot(MigrationEntityType.REPORT); auditRun.setTree(addEntityPanel.getTreeModel()); FormPanel formPanel = new FormPanel<Void>(runDialog.getContentId(), addEntityPanel, true) { private static final long serialVersionUID = 1L; @Override protected void onConfigure() { super.onConfigure(); setOkButtonValue(getString("select")); } }; runDialog.setContent(formPanel); runDialog.show(target); } }; addLink.add(new SimpleTooltipBehavior(getString("Section.Audit.Run.select"))); add(addLink); } private List<String> getOwners() { List<String> owners = new ArrayList<String>(); User[] users = securityService.getUsers(); for (User user : users) { owners.add(user.getUsername()); } Collections.sort(owners, new Comparator<String>() { @Override public int compare(String s1, String s2) { return Collator.getInstance().compare(s1, s2); } }); return owners; } public AuditRun getAuditRun() { auditRun.setEndDate(DateUtil.ceil(auditRun.getEndDate())); return auditRun; } protected TableData getResults(AuditRun auditRun) { TableData result = new TableData(); try { String path = StorageConstants.REPORTS_ROOT; if (auditRun.getPath() != null) { path = StorageConstants.NEXT_SERVER_ROOT + StorageConstants.PATH_SEPARATOR + auditRun.getPath(); } List<RunReportHistory> list = reportService.getRunHistoryForRange(path, new DateRange(auditRun.getStartDate(), auditRun.getEndDate())); List<String> header = Arrays.asList(getString("Section.Audit.Run.owner"), getString("Section.Audit.Run.report"), getString("Section.Audit.Run.start"), getString("Section.Audit.Run.duration"), getString("Section.Audit.Run.end"), getString("Section.Audit.Run.status"), getString("Section.Audit.Rights.path"), getString("type"), getString("Url")); result.setHeader(header); Collections.sort(list, new Comparator<RunReportHistory>() { @Override public int compare(RunReportHistory o1, RunReportHistory o2) { return o1.getStartDate().compareTo(o2.getStartDate()); } }); for (Iterator<RunReportHistory> it = list.iterator(); it.hasNext();) { RunReportHistory h = it.next(); Entity entity = getEntity(h); if (entity != null) { String owner = getOwner(entity); if ( (auditRun.getOwner() == null) || owner.equals(auditRun.getOwner()) ) { if (auditRun.getStatus().equals(AuditRun.STATUS_ALL) || auditRun.getStatus().equals(getStatus(h))) { List<Object> row = new ArrayList<Object>(); row.add(owner); row.add(getName(h)); row.add(h.getStartDate()); row.add(getDuration(h)); row.add(h.getEndDate()); row.add(getStatus(h)); row.add(getReportPath(h)); row.add(h.getRunnerType()); row.add(getUrl(h)); result.getData().add(row); } } } } } catch (NotFoundException e) { LOG.error(e.getMessage(), e); } return result; } private Entity getEntity(RunReportHistory h) { Entity entity = null; try { entity = storageService.getEntityById(h.getRunnerId()); } catch (NotFoundException e) { LOG.error(e.getMessage(), e); } return entity; } private String getOwner(Entity entity) { String owner = ""; if (entity != null) { if (entity instanceof User) { owner = entity.getName(); } else { owner = entity.getCreatedBy(); } } return owner; } private String getStatus(RunReportHistory h) { return h.isSuccess() ? AuditRun.STATUS_SUCCESS : AuditRun.STATUS_FAILED; } private String getReportPath(RunReportHistory h) { String relativePath = h.getPath().substring(StorageConstants.REPORTS_ROOT.length(), h.getPath().indexOf("/runHistory")); return StorageConstants.REPORTS_ROOT + relativePath; } private String getName(RunReportHistory h) { String relativePath = h.getPath().substring(StorageConstants.REPORTS_ROOT.length(), h.getPath().indexOf("/runHistory")); return StorageUtil.getName(relativePath); } private String getDuration(RunReportHistory h) { int runTime = h.getDuration(); String duration = ""; if (runTime >= 0) { DateTimeFormatter formatter = DateTimeFormat.forPattern("HH:mm:ss").withZone(DateTimeZone.UTC); duration = formatter.print(runTime * 1000); } return duration; } private String getUrl(RunReportHistory h) { return h.getUrl(); } protected ArrayList<Integer> getLinkColumns() { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(8); return list; } protected String getTitle() { StringBuilder sb = new StringBuilder(InnerReport.RUN.name()); sb.append(" ( "); sb.append(getString("Section.Audit.Run.owner")); sb.append(" = "); if (auditRun.getOwner() == null) { sb.append(getString("Section.Audit.Run.status.all")); } else { sb.append(auditRun.getOwner()); } sb.append(" )"); return sb.toString(); } }