package ro.nextreports.server.web.core.audit; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.link.ResourceLink; import org.apache.wicket.markup.html.panel.GenericPanel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.resource.ByteArrayResource; 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.domain.Entity; import ro.nextreports.server.report.ReportConstants; import ro.nextreports.server.service.ReportService; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.util.StorageUtil; import ro.nextreports.server.web.analysis.AnalysisSection; import ro.nextreports.server.web.chart.ChartSection; import ro.nextreports.server.web.common.misc.LabelLink; import ro.nextreports.server.web.common.misc.SimpleLink; import ro.nextreports.server.web.common.table.BaseTable; import ro.nextreports.server.web.core.HomePage; import ro.nextreports.server.web.core.audit.rights.AuditRights; import ro.nextreports.server.web.core.audit.rights.RightsPanel; import ro.nextreports.server.web.core.section.SectionContextUtil; import ro.nextreports.server.web.core.section.SectionManager; import ro.nextreports.server.web.dashboard.DashboardSection; import ro.nextreports.server.web.dashboard.table.TableResource; import ro.nextreports.server.web.datasource.DataSourceSection; import ro.nextreports.server.web.report.ReportSection; import ro.nextreports.server.web.schedule.SchedulerSection; public class AuditTableRendererPanel extends GenericPanel<TableData> { @SpringBean private ReportService reportService; @SpringBean private StorageService storageService; @SpringBean private SectionManager sectionManager; private static final Logger LOG = LoggerFactory.getLogger(AuditTableRendererPanel.class); private static DateFormat DATE_FORMAT= DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); private List<Integer> links; private String type; public AuditTableRendererPanel(String id, String type, IModel<TableData> model, IModel<List<Integer>> linksModel, IModel<String> title) { super(id, model); this.type = type; links = linksModel.getObject(); add(new Label("title", title.getObject())); add(createSaveToExcelLink(model)); AuditDataProvider dataProvider = new AuditDataProvider(model.getObject()); WebMarkupContainer container = new WebMarkupContainer("tableContainer"); container.add(getCurrentTable(dataProvider)); add(container); } private BaseTable getCurrentTable(AuditDataProvider dataProvider) { List<String> tableHeader = dataProvider.getHeader(); BaseTable<List<Object>> table = new BaseTable<List<Object>>("table", getPropertyColumns(tableHeader), dataProvider, 100); return table; } private List<IColumn<List<Object>, String>> getPropertyColumns(List<String> header) { List<IColumn<List<Object>, String>> columns = new ArrayList<IColumn<List<Object>, String>>(); int columnCount = header.size(); for (int i = 0; i < columnCount; i++) { if ((links != null) && links.contains(i)) { final int index = i; columns.add(new AbstractColumn<List<Object>, String>(new Model<String>(getString("Url"))) { public void populateItem(Item<ICellPopulator<List<Object>>> item, String componentId, final IModel<List<Object>> rowModel) { String url = (String)rowModel.getObject().get(index); if (InnerReport.RUN.toString().equals(type)) { if ((url == null) || url.equals("")) { item.add(new Label(componentId)); return; } else if (url.equals(ReportConstants.ETL_FORMAT)) { item.add(new Label(componentId, Model.of(url))); return; } // dynamic url String fileName = url.substring(url.lastIndexOf("/") + 1); String dynamicUrl = reportService.getReportURL(fileName); item.add(new SimpleLink(componentId, dynamicUrl, getString("view"), true)); } else if (InnerReport.RIGHTS.toString().equals(type)) { LabelLink link = new LabelLink(componentId, Model.of(""), Model.of(getString("WidgetPopupMenu.gotoEntity"))) { private static final long serialVersionUID = 1L; @Override public void onClick() { String sectionId = getSectionId(); String entityPath = (String)rowModel.getObject().get(RightsPanel.PATH_COLUMN); try { Entity entity = storageService.getEntity(entityPath); sectionManager.setSelectedSectionId(sectionId); SectionContextUtil.setCurrentPath(sectionId, StorageUtil.getParentPath(entity.getPath())); SectionContextUtil.setSelectedEntityPath(sectionId, entity.getPath()); setResponsePage(HomePage.class); } catch (Exception e) { e.printStackTrace(); } } private String getSectionId() { String category = (String)rowModel.getObject().get(RightsPanel.CATEGORY_COLUMN); String sectionId = null; if (category.equals(getString("Section.Audit.Entity." + AuditRights.ENTITY_DASHBOARDS))) { sectionId = DashboardSection.ID; } else if (category.equals(getString("Section.Audit.Entity." + AuditRights.ENTITY_REPORTS))) { sectionId = ReportSection.ID; } else if (category.equals(getString("Section.Audit.Entity." + AuditRights.ENTITY_CHARTS))) { sectionId = ChartSection.ID; } else if (category.equals(getString("Section.Audit.Entity." + AuditRights.ENTITY_DATA_SOURCES))) { sectionId = DataSourceSection.ID; } else if (category.equals(getString("Section.Audit.Entity." + AuditRights.ENTITY_SCHEDULERS))) { sectionId = SchedulerSection.ID; } else if (category.equals(getString("Section.Audit.Entity." + AuditRights.ENTITY_ANALYSIS))) { sectionId = AnalysisSection.ID; } return sectionId; } }; item.add(link); } } }); } else { columns.add(new PropertyColumn<List<Object>, String>(new Model<String>(header.get(i)), header.get(i), String.valueOf(i)) { @Override public IModel<Object> getDataModel(IModel rowModel) { IModel<Object> model = super.getDataModel(rowModel); if ((model.getObject() instanceof Date) && (model.getObject() != null)) { return new Model(DATE_FORMAT.format((Date)model.getObject())); } return model; } }); } } return columns; } private Link<TableResource> createSaveToExcelLink(final IModel<TableData> model) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH-mm-ss"); String fileName = "audit-" + type.toLowerCase() + "-" + sdf.format(new Date()) + ".xls"; ByteArrayResource download = new TableResource(excludeColumns(model.getObject()), fileName); ResourceLink resourceLink = new ResourceLink<TableResource>("download", download); // see busy-indicator.js // we do not want a busy indicator in this situation resourceLink.add(new AttributeAppender("class", new Model<String>("noBusyIndicator"), " ")); return resourceLink; } private TableData excludeColumns(TableData td) { if ((links == null) || links.isEmpty()) { return td; } td.setExcludedColumns(links); return td; } }