diff --git a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaPresenter.java b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaPresenter.java index 966844a..94a3044 100644 --- a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaPresenter.java +++ b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaPresenter.java @@ -28,6 +28,7 @@ public class MainAreaPresenter extends Presenter implements MainAreaUiHandlers { + @SuppressWarnings("unused") private static Logger logger = Logger.getLogger(""); interface MainAreaView extends View, HasUiHandlers { @@ -43,7 +44,9 @@ public class MainAreaPresenter public static final SingleSlot SLOT_FILTER = new SingleSlot<>(); public static final SingleSlot SLOT_REPORT = new SingleSlot<>(); + @SuppressWarnings("unused") private EventBus eventBus; + @SuppressWarnings("unused") private Controller controller; private FilterAreaPresenter filterAreaPresenter; private ReportAreaPresenter reportAreaPresenter; diff --git a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaView.java b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaView.java index 1865158..e01de59 100644 --- a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaView.java +++ b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/MainAreaView.java @@ -19,6 +19,7 @@ import com.gwtplatform.mvp.client.ViewWithUiHandlers; */ public class MainAreaView extends ViewWithUiHandlers implements MainAreaPresenter.MainAreaView { + @SuppressWarnings("unused") private static Logger logger = java.util.logging.Logger.getLogger(""); interface Binder extends UiBinder { @@ -31,6 +32,7 @@ public class MainAreaView extends ViewWithUiHandlers implemen HTMLPanel reportPanel; + @SuppressWarnings("unused") private AppResources resources; @Inject diff --git a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaPresenter.java b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaPresenter.java index 6830872..17f4782 100644 --- a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaPresenter.java +++ b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaPresenter.java @@ -9,6 +9,7 @@ import org.gcube.portlets.user.accountingdashboard.client.application.event.Scop import org.gcube.portlets.user.accountingdashboard.shared.data.RequestReportData; import org.gcube.portlets.user.accountingdashboard.shared.data.ScopeData; +import com.google.gwt.i18n.client.DateTimeFormat; import com.google.inject.Inject; import com.google.web.bindery.event.shared.EventBus; import com.gwtplatform.mvp.client.HasUiHandlers; @@ -31,6 +32,7 @@ public class FilterAreaPresenter extends PresenterWidget 0) { + private boolean checkDate(String dateStart, String dateEnd) { + DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("yyyy-MM-dd"); + + Date dateStartD = null; + try { + logger.fine("DateTemp1: " + dateStart); + dateStartD = dateTimeFormat.parse(dateStart); + logger.fine("DateStart: " + dateStartD); + } catch (Exception e) { + logger.log(Level.SEVERE, "Error in start date: " + e.getLocalizedMessage(), e); + return false; + } + + + Date dateEndD = null; + try { + logger.fine("DateTemp2: " + dateEnd); + dateEndD = dateTimeFormat.parse(dateEnd); + logger.fine("DateEnd: " + dateEndD); + + } catch (Exception e) { + logger.log(Level.SEVERE, "Error in end date: " + e.getLocalizedMessage(), e); + return false; + } + + if (dateStartD.compareTo(dateEndD) > 0) { controller.errorShow("Attention the start date must be less than the end date!"); return false; } else { diff --git a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaView.java b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaView.java index b37fc59..25a1cda 100644 --- a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaView.java +++ b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/filter/FilterAreaView.java @@ -28,9 +28,7 @@ import com.google.gwt.user.cellview.client.CellTree; import com.google.gwt.user.cellview.client.TreeNode; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.user.datepicker.client.CalendarUtil; import com.google.gwt.view.client.ListDataProvider; - import com.gwtplatform.mvp.client.ViewWithUiHandlers; /** @@ -97,9 +95,6 @@ public class FilterAreaView extends ViewWithUiHandlers for (int i = 2015; i <= year; i++) { yearStart.addItem(String.valueOf(i)); yearEnd.addItem(String.valueOf(i)); - if (i == year) { - - } } yearStart.setSelectedValue(String.valueOf(year)); yearEnd.setSelectedValue(String.valueOf(year)); @@ -130,7 +125,7 @@ public class FilterAreaView extends ViewWithUiHandlers monthEnd = new ListBox(); monthEnd.setMultipleSelect(false); - + for (int i = 0; i < months.length; i++) { monthStart.addItem(months[i]); monthEnd.addItem(months[i]); @@ -192,37 +187,44 @@ public class FilterAreaView extends ViewWithUiHandlers } private void requestReport() { - DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("yyyy-M-dd"); - + String[] months = LocaleInfo.getCurrentLocale().getDateTimeFormatInfo().monthsFull(); + logger.log(Level.FINE, "Months: " + months.length); + String yearS = yearStart.getValue(); String monthS = monthStart.getValue(); - - Date dateStart = null; - try { - String dStart = yearS + "-" + monthS + "-01"; - logger.fine("DateTemp1: " + dStart); - dateStart = dateTimeFormat.parse(dStart); - logger.fine("DateStart: " + dStart); - } catch (Exception e) { - logger.log(Level.SEVERE, "Error in start date: " + e.getLocalizedMessage(), e); - + + String monthSN=null; + for(int i=0; i9){ + monthSN=""+v; + } else { + monthSN="0"+v; + } + } } - + + String dateStart = yearS + "-" + monthSN + "-01"; + logger.fine("DateStart: " + dateStart); + String yearE = yearEnd.getValue(); String monthE = monthEnd.getValue(); - Date dateEnd = null; - try { - String dEnd = yearE + "-" + monthE + "-01"; - logger.fine("DateTemp2: " + dEnd); - dateEnd = dateTimeFormat.parse(dEnd); - CalendarUtil.addMonthsToDate(dateEnd, 1); - CalendarUtil.addDaysToDate(dateEnd, -1); - logger.fine("DateEnd: " + dateEnd); - - } catch (Exception e) { - logger.log(Level.SEVERE, "Error in end date: " + e.getLocalizedMessage(), e); + String monthEN=null; + for(int i=0; i9){ + monthEN=""+v; + } else { + monthEN="0"+v; + } + } } + + String dateEnd = yearE + "-" + monthEN + "-01"; + logger.fine("DateEnd: " + dateEnd); RequestReportData requestReportData = new RequestReportData(scopeData, dateStart, dateEnd); getUiHandlers().getReport(requestReportData); diff --git a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart.java b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart.java index 6ff0c90..7085463 100644 --- a/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart.java +++ b/src/main/java/org/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart.java @@ -21,11 +21,13 @@ public class Chart extends HTMLPanel { + "type='button' style='float:right;' data-toggle='dropdown'>" + "" + "" + "" + "" + ""); + + name + "_ExportJPEG' href='#' download='" + reportElementData.getLabel() + ".jpeg'>Export JPEG" + + "" + "
  • Export PNG" + "
  • " + "
  • Export PDF" + "
  • " + "
  • Export CSV" + "
  • " + + "" + "" + ""); this.name = name; this.reportElementData = reportElementData; this.addStyleName(resources.uiDataCss().uiDataChartWrapper()); @@ -70,13 +72,6 @@ public class Chart extends HTMLPanel { console.log('This: ' + this); var name = this.@org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::name; - //Export PNG - var elementNamePNG = name + '_ExportPNG'; - console.log('ExportPNG search: ' + elementNamePNG); - var exportPNGElement = $doc.getElementById(elementNamePNG); - console.log('ExportPNGElement: ' + exportPNGElement); - exportPNGElement.onclick = @org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::saveImagePNG(Lorg/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart;)(this); - //Export JPEG var elementNameJPEG = name + '_ExportJPEG'; console.log('ExportJPEG search: ' + elementNameJPEG); @@ -84,6 +79,13 @@ public class Chart extends HTMLPanel { console.log('ExportJPEGElement: ' + exportJPEGElement); exportJPEGElement.onclick = @org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::saveImageJPEG(Lorg/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart;)(this); + //Export PNG + var elementNamePNG = name + '_ExportPNG'; + console.log('ExportPNG search: ' + elementNamePNG); + var exportPNGElement = $doc.getElementById(elementNamePNG); + console.log('ExportPNGElement: ' + exportPNGElement); + exportPNGElement.onclick = @org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::saveImagePNG(Lorg/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart;)(this); + //Export PDF var elementNamePDF = name + '_ExportPDF'; console.log('ExportPDF search: ' + elementNamePDF); @@ -91,6 +93,38 @@ public class Chart extends HTMLPanel { console.log('ExportPDFElement: ' + exportPDFElement); exportPDFElement.onclick = @org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::saveFilePDF(Lorg/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart;Ljava/lang/String;)(this,exportPDFElement.download); + //Export CSV + var elementNameCSV = name + '_ExportCSV'; + console.log('ExportCSV search: ' + elementNameCSV); + var exportCSVElement = $doc.getElementById(elementNameCSV); + console.log('ExportCSVElement: ' + exportCSVElement); + exportCSVElement.onclick = @org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::saveFileCSV(Lorg/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart;)(this); + + }-*/; + + private static native void saveImageJPEG(Chart chart)/*-{ + console.log('saveImageJPEG()'); + var name = chart.@org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::name; + console.log('Element name: ' + name); + var canvas = @org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::getCanvas(Lorg/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart;)(chart); + return function() { + console.log('Save file jpeg'); + //Set Background White + var w = canvas.width; + var h = canvas.height; + var ctx = canvas.getContext('2d'); + var data = ctx.getImageData(0, 0, w, h); + var compositeOperation = ctx.globalCompositeOperation; + ctx.globalCompositeOperation = "destination-over"; + ctx.fillStyle = '#ffffff'; + ctx.fillRect(0, 0, w, h); + var image = canvas.toDataURL("image/jpeg").replace("image/jpeg", + "image/octet-stream"); + ctx.clearRect(0, 0, w, h); + ctx.putImageData(data, 0, 0); + ctx.globalCompositeOperation = compositeOperation; + this.href = image; + }; }-*/; private static native void saveImagePNG(Chart chart)/*-{ @@ -102,26 +136,11 @@ public class Chart extends HTMLPanel { console.log('Save file png'); var image = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); - console.log('Image url: ' + image); this.href = image; //window.open(image, '_blank'); }; }-*/; - private static native void saveImageJPEG(Chart chart)/*-{ - console.log('saveImageJPEG()'); - var name = chart.@org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::name; - console.log('Element name: ' + name); - var canvas = @org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::getCanvas(Lorg/gcube/portlets/user/accountingdashboard/client/application/mainarea/report/chartjs/Chart;)(chart); - return function() { - console.log('Save file jpeg'); - var image = canvas.toDataURL("image/jpeg").replace("image/jpeg", - "image/octet-stream"); - console.log('Image url: ' + image); - this.href = image; - }; - }-*/; - private static native void saveFilePDF(Chart chart, String filename)/*-{ console.log('saveFilePDF()'); var name = chart.@org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::name; @@ -136,12 +155,54 @@ public class Chart extends HTMLPanel { doc.addImage(image, 'JPEG', 10, 10, 280, 150); doc.save(filename); return false; - - //console.log('Image url: ' + image); - //this.href = image; }; }-*/; + private static native void saveFileCSV(Chart chart)/*-{ + console.log('saveFileCSV()'); + var reportElementData = chart.@org.gcube.portlets.user.accountingdashboard.client.application.mainarea.report.chartjs.Chart::reportElementData; + console.log('ReportElementData: ' + reportElementData); + return function() { + console.log('Save file csv'); + + var serieses = reportElementData.getSerieses(); + console.log('Serieses: ' + serieses); + var seriesesLen = serieses.length; + console.log('Serieses lenght: ' + seriesesLen); + + var csvContent = "data:text/csv;charset=utf-8,"; + for (var i = 0; i < seriesesLen; i++) { + var seriesData = serieses[i]; + var dataRow = seriesData.getDataRow(); + var dataRowLen = dataRow.length; + + var dataArray = []; + if (i == 0) { + var heading = "Date"; + var datasetRow = seriesData.getLabel(); + for (var j = 0; j < dataRowLen; j++) { + var recordData = dataRow[j]; + heading += "," + recordData.getX(); + datasetRow += "," + recordData.getY(); + } + csvContent += heading + "\r\n"; + csvContent += datasetRow + "\r\n"; + + } else { + var datasetRow = seriesData.getLabel(); + for (var j = 0; j < dataRowLen; j++) { + var recordData = dataRow[j]; + datasetRow += "," + recordData.getY(); + } + csvContent += datasetRow + "\r\n"; + } + } + this.href = csvContent; + + }; + + }-*/; + private native void redrawChart() /*-{ console.log('RedrawChart()'); @@ -190,7 +251,6 @@ public class Chart extends HTMLPanel { console.log('ReportElementData: ' + reportElementData); var serieses = reportElementData.getSerieses(); - console.log('Serieses: ' + serieses); var seriesesLen = serieses.length; console.log('Serieses lenght: ' + seriesesLen); @@ -242,8 +302,6 @@ public class Chart extends HTMLPanel { var yAxisLabel = reportElementData.getyAxis(); var ctx = canvas.getContext('2d'); - ctx.fillStyle = 'white'; - ctx.fillRect(0, 0, canvas.width, canvas.height); console.log('Create chart'); var chart = new Chart(ctx, { diff --git a/src/main/java/org/gcube/portlets/user/accountingdashboard/server/accounting/AccountingService.java b/src/main/java/org/gcube/portlets/user/accountingdashboard/server/accounting/AccountingService.java index 658f004..fe92299 100644 --- a/src/main/java/org/gcube/portlets/user/accountingdashboard/server/accounting/AccountingService.java +++ b/src/main/java/org/gcube/portlets/user/accountingdashboard/server/accounting/AccountingService.java @@ -1,7 +1,7 @@ package org.gcube.portlets.user.accountingdashboard.server.accounting; import java.util.ArrayList; -import java.util.Date; +import java.util.GregorianCalendar; import javax.servlet.http.HttpServletRequest; @@ -20,6 +20,8 @@ import org.gcube.portlets.user.accountingdashboard.shared.exception.ServiceExcep import org.slf4j.Logger; import org.slf4j.LoggerFactory; + + /** * * @author Giancarlo Panichi @@ -116,12 +118,44 @@ public class AccountingService { ScopeDescriptor scopeDescriptor = searchScopeDescriptor(httpServletRequest, requestReportData.getScopeData()); - Date dateFrom = requestReportData.getDateFrom(); - Date dateTo = requestReportData.getDateTo(); + String dateStart = requestReportData.getDateFrom(); + String dateEnd = requestReportData.getDateTo(); - logger.debug("getReportByScope(): [ScopeDescriptor=" + scopeDescriptor + ", dateFrom=" + dateFrom - + ", dateTo=" + dateTo + ", measureResolution=" + MeasureResolution.MONTHLY + "]"); - Report report = dao.getReportByScope(scopeDescriptor, dateFrom, dateTo, MeasureResolution.MONTHLY); + if (dateStart == null || dateStart.isEmpty() || dateEnd == null || dateEnd.isEmpty()) { + logger.error("Invalid date: [dateStart=" + dateStart + ", dateEnd=" + dateEnd + "]"); + throw new ServiceException( + "Invalid format: [dateStart=" + dateStart + ", dateEnd=" + dateEnd + "]"); + } + + GregorianCalendar dateFrom; + GregorianCalendar dateTo; + try { + int yearS = Integer.parseInt(dateStart.substring(0, 4)); + logger.debug("yearS: " + yearS); + int monthS = Integer.parseInt(dateStart.substring(5, 7)) - 1; + logger.debug("monthS: " + monthS); + int dayS = Integer.parseInt(dateStart.substring(8, 10)); + logger.debug("dayS: " + dayS); + + dateFrom = new GregorianCalendar(yearS, monthS, dayS); + + int yearE = Integer.parseInt(dateEnd.substring(0, 4)); + int monthE = Integer.parseInt(dateEnd.substring(5, 7)) - 1; + int dayE = Integer.parseInt(dateEnd.substring(8, 10)); + dateTo = new GregorianCalendar(yearE, monthE, dayE); + + } catch (Throwable e) { + logger.error("Invalid date format: [dateStart=" + dateStart + ", dateEnd=" + dateEnd + "]"); + throw new ServiceException( + "Invalid date format: [dateStart=" + dateStart + ", dateEnd=" + dateEnd + "]"); + + } + + logger.debug("getReportByScope(): [ScopeDescriptor=" + scopeDescriptor + ", dateFrom=" + + dateFrom.getTime() + ", dateTo=" + dateTo.getTime() + ", measureResolution=" + + MeasureResolution.MONTHLY + "]"); + Report report = dao.getReportByScope(scopeDescriptor, dateFrom.getTime(), dateTo.getTime(), + MeasureResolution.MONTHLY); logger.debug("Report: " + report); ReportDataBuilder reportDataBuilder = new ReportDataBuilder(report); @@ -180,7 +214,8 @@ public class AccountingService { int i) throws ServiceException { try { for (ScopeDescriptor child : scopeDescriptor.getChildren()) { - if (child.getName()!=null&&!child.getName().isEmpty()&&child.getName().compareTo(searchPath[i]) == 0) { + if (child.getName() != null && !child.getName().isEmpty() + && child.getName().compareTo(searchPath[i]) == 0) { i++; if (i < searchPath.length) { return searchInChild(child, scopeToSearch, searchPath, i); diff --git a/src/main/java/org/gcube/portlets/user/accountingdashboard/shared/data/RequestReportData.java b/src/main/java/org/gcube/portlets/user/accountingdashboard/shared/data/RequestReportData.java index c3791ec..187b727 100644 --- a/src/main/java/org/gcube/portlets/user/accountingdashboard/shared/data/RequestReportData.java +++ b/src/main/java/org/gcube/portlets/user/accountingdashboard/shared/data/RequestReportData.java @@ -1,7 +1,6 @@ package org.gcube.portlets.user.accountingdashboard.shared.data; import java.io.Serializable; -import java.util.Date; /** * @@ -12,14 +11,14 @@ public class RequestReportData implements Serializable { private static final long serialVersionUID = -7428707426843173730L; private ScopeData scopeData; - private Date dateFrom; - private Date dateTo; + private String dateFrom; + private String dateTo; public RequestReportData() { super(); } - public RequestReportData(ScopeData scopeData, Date dateFrom, Date dateTo) { + public RequestReportData(ScopeData scopeData, String dateFrom, String dateTo) { super(); this.scopeData = scopeData; this.dateFrom = dateFrom; @@ -34,19 +33,19 @@ public class RequestReportData implements Serializable { this.scopeData = scopeData; } - public Date getDateFrom() { + public String getDateFrom() { return dateFrom; } - public void setDateFrom(Date dateFrom) { + public void setDateFrom(String dateFrom) { this.dateFrom = dateFrom; } - public Date getDateTo() { + public String getDateTo() { return dateTo; } - public void setDateTo(Date dateTo) { + public void setDateTo(String dateTo) { this.dateTo = dateTo; }