1+ package com .genexus ;
2+
3+ import com .genexus .diagnostics .core .ILogger ;
4+ import com .genexus .diagnostics .core .LogManager ;
5+ import com .genexus .webpanels .HttpContextWeb ;
6+
7+ public abstract class GXDataGridProcedure extends GXProcedure {
8+
9+ private static final ILogger logger = LogManager .getLogger (GXDataGridProcedure .class );
10+
11+ private static final String HAS_NEXT_PAGE = "HasNextPage" ;
12+ private static final String RECORD_COUNT = "RecordCount" ;
13+ private static final String RECORD_COUNT_SUPPORTED = "RecordCountSupported" ;
14+ private long totalRecordCount = -1 ;
15+
16+ public GXDataGridProcedure (int remoteHandle , ModelContext context , String location ) {
17+ super (false , remoteHandle , context , location );
18+ }
19+
20+ protected long recordCount (){
21+ return -1 ;
22+ }
23+
24+ protected boolean recordCountSupported (){
25+ return true ;
26+ }
27+
28+ protected void setPaginationHeaders (boolean hasNextPage ) {
29+ try {
30+ setHasNextPageHeader (hasNextPage );
31+ setRecordCountSupportedHeader ();
32+ }
33+ catch (Exception ex ) {
34+ logger .warn ("A processing error occurred while setting pagination headers" , ex );
35+ }
36+ }
37+
38+ private void setRecordCountSupportedHeader () {
39+ if (!recordCountSupported ()) {
40+ logger .debug ("Adding '{RECORD_COUNT_SUPPORTED}' header" );
41+ ((HttpContextWeb ) context .getHttpContext ()).setHeader (RECORD_COUNT_SUPPORTED , String .valueOf (false ));
42+ }
43+ }
44+
45+ private void setHasNextPageHeader (boolean hasNextPage ) {
46+ ((HttpContextWeb ) context .getHttpContext ()).setHeader (HAS_NEXT_PAGE , String .valueOf (hasNextPage ));
47+ }
48+
49+ private void setRecordCountHeader () {
50+ boolean recordCountHeaderRequired = false ;
51+ boolean setHeader = false ;
52+ if (context .getHttpContext () != null ) {
53+ recordCountHeaderRequired = !context .getHttpContext ().getHeader (RECORD_COUNT ).isEmpty ();
54+ }
55+ if (totalRecordCount != -1 ) {
56+ setHeader = true ;
57+ }
58+ else if (recordCountHeaderRequired ) {
59+ totalRecordCount = recordCount ();
60+ setHeader = true ;
61+ }
62+ if (setHeader ) {
63+ logger .debug ("Adding '{RECORD_COUNT}' header: " + totalRecordCount );
64+ ((HttpContextWeb ) context .getHttpContext ()).setHeader (RECORD_COUNT , String .valueOf (totalRecordCount ));
65+ }
66+ }
67+
68+ protected long getPaginationStart (long start , long count ) {
69+ if (start < 0 ) { //last page
70+ totalRecordCount = recordCount ();
71+ long lastPageRecords = totalRecordCount % count ;
72+ if (lastPageRecords == 0 )
73+ start = totalRecordCount - count ;
74+ else
75+ start = totalRecordCount - lastPageRecords ;
76+ }
77+ setRecordCountHeader ();
78+ return start ;
79+ }
80+ }
0 commit comments