/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ro.nextreports.server.web.core;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
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.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ResourceLink;
import org.apache.wicket.markup.html.panel.Panel;
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.IResource;
import org.apache.wicket.spring.injection.annot.SpringBean;
import ro.nextreports.server.domain.Chart;
import ro.nextreports.server.domain.Entity;
import ro.nextreports.server.domain.Report;
import ro.nextreports.server.domain.VersionInfo;
import ro.nextreports.server.service.ChartService;
import ro.nextreports.server.service.ReportService;
import ro.nextreports.server.service.SecurityService;
import ro.nextreports.server.service.StorageService;
import ro.nextreports.server.util.PermissionUtil;
import ro.nextreports.server.util.ServerUtil;
import ro.nextreports.server.web.chart.ChartPanel;
import ro.nextreports.server.web.chart.ChartResource;
import ro.nextreports.server.web.common.behavior.AlertBehavior;
import ro.nextreports.server.web.common.menu.MenuItem;
import ro.nextreports.server.web.common.menu.MenuPanel;
import ro.nextreports.server.web.common.table.BaseTable;
import ro.nextreports.server.web.common.table.DateColumn;
import ro.nextreports.server.web.core.EntityBrowserPanel;
import ro.nextreports.server.web.core.EntityVersionDataProvider;
import ro.nextreports.server.web.report.ReportResource;
import ro.nextreports.server.web.schedule.ScheduleWizard;
public class ViewVersionsPanel extends Panel {
private static final long serialVersionUID = 1L;
private Report report;
private Chart chart;
private DataTable<VersionInfo, String> table;
private EntityVersionDataProvider dataProvider;
@SpringBean
private StorageService storageService;
@SpringBean
private ReportService reportService;
@SpringBean
private ChartService chartService;
@SpringBean
private SecurityService securityService;
public ViewVersionsPanel(String id, final Report report) {
super(id);
this.report = report;
init(getString("Report"), report.getName());
}
public ViewVersionsPanel(String id, final Chart chart) {
super(id);
this.chart = chart;
init(getString("Chart"), chart.getName());
}
private void init(String entityName, String reportName) {
add(new Label("legend", entityName + " " + getString("ActionContributor.Versions.name")));
add(new Label("entityName", entityName));
Label name = new Label("reportName", new Model<String>(reportName));
add(name);
addVersionsTable();
add(new AjaxLink<Void>("cancel") {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
EntityBrowserPanel panel = findParent(EntityBrowserPanel.class);
panel.backwardWorkspace(target);
}
});
}
private void addVersionsTable() {
List<IColumn<VersionInfo, String>> columns = new ArrayList<IColumn<VersionInfo, String>>();
columns.add(new AbstractColumn<VersionInfo, String>(new Model<String>(getString("name"))) {
private static final long serialVersionUID = 1L;
@Override
public String getCssClass() {
return "name-col";
}
public void populateItem(Item<ICellPopulator<VersionInfo>> item, String componentId,
final IModel<VersionInfo> rowModel) {
final VersionInfo version = rowModel.getObject();
final String name = version.getName();
item.add(new Label(componentId, new Model<String>(name)));
item.add(AttributeModifier.replace("class", "name-col"));
}
});
columns.add(new ActionsColumn());
columns.add(new AbstractColumn<VersionInfo, String>(new Model<String>(getString("author"))) {
private static final long serialVersionUID = 1L;
public void populateItem(Item<ICellPopulator<VersionInfo>> item, String componentId,
final IModel<VersionInfo> rowModel) {
final VersionInfo version = rowModel.getObject();
final String author = version.getCreatedBy();
item.add(new Label(componentId, new Model<String>(author)));
}
});
columns.add(new DateColumn<VersionInfo>(new Model<String>(getString("date")), "createdDate", "createdDate" ));
columns.add(new AbstractColumn<VersionInfo, String>(new Model<String>(getString("current"))) {
private static final long serialVersionUID = 1L;
public void populateItem(Item<ICellPopulator<VersionInfo>> item, String componentId,
final IModel<VersionInfo> rowModel) {
final VersionInfo version = rowModel.getObject();
final Boolean current = version.isBaseVersion();
item.add(new Label(componentId, new Model<Boolean>(current)));
}
});
dataProvider = new EntityVersionDataProvider(getEntity().getId());
table = new BaseTable<VersionInfo>("table", columns, dataProvider, 300);
table.setOutputMarkupId(true);
add(table);
}
private String getEntityPath() {
return getEntity().getPath();
}
private Entity getEntity() {
if (report != null) {
return report;
} else {
return chart;
}
}
private class ActionsColumn extends AbstractColumn<VersionInfo, String> {
private static final long serialVersionUID = 1L;
public ActionsColumn() {
super(new Model<String>("Actions"));
}
@Override
public String getCssClass() {
return "actions-col";
}
public void populateItem(Item<ICellPopulator<VersionInfo>> cellItem, String componentId, IModel<VersionInfo> model) {
cellItem.add(new ActionPanel(componentId, model));
cellItem.add(AttributeModifier.replace("class", "actions-col"));
}
}
private class ActionPanel extends Panel {
private static final long serialVersionUID = 1L;
public ActionPanel(String id, final IModel<VersionInfo> model) {
super(id, model);
setRenderBodyOnly(true);
MenuPanel menuPanel = new MenuPanel("menuPanel");
add(menuPanel);
MenuItem mi = new MenuItem("images/actions.png", null);
menuPanel.addMenuItem(mi);
AjaxLink<VersionInfo> runLink = new AjaxLink<VersionInfo>(MenuPanel.LINK_ID, model) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
VersionInfo version = model.getObject();
try {
if (report != null) {
Report reportVersion = (Report) storageService.getVersion(report.getId(), version.getName());
EntityBrowserPanel panel = findParent(EntityBrowserPanel.class);
ScheduleWizard wizard = new ScheduleWizard("work", reportVersion, true);
panel.forwardWorkspace(wizard, target);
} else {
Chart chartVersion = (Chart) storageService.getVersion(chart.getId(), version.getName());
EntityBrowserPanel panel = findParent(EntityBrowserPanel.class);
ChartPanel chartPanel = new ChartPanel("work", new Model<Chart>(chartVersion));
panel.forwardWorkspace(chartPanel, target);
}
} catch (Exception e) {
e.printStackTrace();
add(new AlertBehavior(e.getMessage()));
target.add(this);
}
}
@Override
public boolean isVisible() {
boolean visible = false;
try {
visible = securityService.hasPermissionsById(ServerUtil.getUsername(),
PermissionUtil.getExecute(), getEntity().getId());
} catch (Exception e) {
e.printStackTrace();
}
return visible;
}
};
mi.addMenuItem(new MenuItem(runLink, getString("run"), "images/run.gif"));
AjaxLink<VersionInfo> restoreLink = new AjaxLink<VersionInfo>(MenuPanel.LINK_ID, model) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
VersionInfo version = model.getObject();
try {
// IMPORTANT : see ReportRestoredAdvice
reportService.restoreReportVersion(getEntityPath(), version.getName());
target.add(table);
} catch (Exception e) {
e.printStackTrace();
add(new AlertBehavior(e.getMessage()));
target.add(this);
}
}
@Override
public boolean isVisible() {
boolean visible = false;
try {
visible = securityService.hasPermissionsById(ServerUtil.getUsername(),
PermissionUtil.getWrite(), getEntity().getId());
} catch (Exception e) {
e.printStackTrace();
}
return visible;
}
};
mi.addMenuItem(new MenuItem(restoreLink, getString("ActionContributor.Versions.setCurrent"), "images/report_restore.png"));
//todo is there a possibility to take the version only when the link is clicked????
try {
final IResource download;
if (report != null) {
Report reportVersion = (Report) storageService.getVersion(report.getId(), ((VersionInfo) model.getObject()).getName());
download = new ReportResource(reportVersion);
} else {
Chart chartVersion = (Chart) storageService.getVersion(chart.getId(), ((VersionInfo) model.getObject()).getName());
download = new ChartResource(chartVersion);
}
// download.setCacheable(false);
ResourceLink<Void> downloadLink = new ResourceLink<Void>(MenuPanel.LINK_ID, download);
mi.addMenuItem(new MenuItem(downloadLink, getString("download"), "images/download.png"));
} catch (Exception e) {
e.printStackTrace();
}
AjaxLink<VersionInfo> infoLink = new AjaxLink<VersionInfo>(MenuPanel.LINK_ID, model) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
VersionInfo version = model.getObject();
try {
ViewInfoPanel viewInfoPanel;
if (report != null) {
Report reportVersion = (Report) storageService.getVersion(report.getId(), version.getName());
viewInfoPanel = new ViewInfoPanel("work", reportVersion, report, version.getName());
} else {
Chart chartVersion = (Chart) storageService.getVersion(chart.getId(), version.getName());
viewInfoPanel = new ViewInfoPanel("work", chartVersion, chart, version.getName());
}
EntityBrowserPanel panel = findParent(EntityBrowserPanel.class);
panel.forwardWorkspace(viewInfoPanel, target);
} catch (Exception e) {
e.printStackTrace();
add(new AlertBehavior(e.getMessage()));
target.add(this);
}
}
};
mi.addMenuItem(new MenuItem(infoLink, getString("ActionContributor.Info.name"), "images/info.png"));
}
}
}