Server-side Listeners
There may be times when you want to add your own server-side logic to further customize a report. For example, you may want to apply an additional validation that can't be enforced on the client, or you may want to prepopulate a filter.
Let's attach a listener to the BookstoreReportTutorial. First, we will add a new class called BookstoreReportTutorialListener to the com.mybooks.web package.
These are the steps to add a class:
In Package Explorer on the left side of Studio...
Expand Bookstore
Expand private-src
Right click on com.mybooks.web
Select New → Class
Type "BookstoreReportTutorialListener" in the Name field.
Click Finish.
For the moment, we'll keep the code simple - we'll override one of the hook methods in the base class and just log some information.
package com.mybooks.web; import org.json.JSONArray;import org.json.JSONObject; import com.onenetwork.platform.integ.rest.report.BaseReportResourceListener;import com.onenetwork.platform.tools.log.PlatformLogger; public class BookstoreReportTutorialListener extends BaseReportResourceListener { private static PlatformLogger LOG = PlatformLogger.get(BookstoreReportTutorialListener.class); @Override public JSONObject beforeParseFilters(JSONObject filters) { LOG.info("BookstoreReportTutorialListener.beforeParseFilters: " + filters); return super.beforeParseFilters(filters); } }After adding the class, build your project with Ant and restart your server. (Remember, code changes typically require an ant build + server restart.) Finally, add the following ReportJsonListenerClass tag to your report and submit it:
<Report columnQuantity="2"> <Name>BookstoreReportTutorial</Name> <ReportJsonListenerClass>com.mybooks.web.BookstoreReportTutorialListener</ReportJsonListenerClass>Now if you execute the report, you should see a log along the following lines in your Platform Server:
17:54:18,371 INFO (tp-0.0.0.0-80-8) [oreReportTutorialListener] BookstoreReportTutorialListener.beforeParseFilters: {}If you actually provide a filter value in the UI, you will see that information coming through. For example, type "Learning" in the Title filter:
18:00:28,857 INFO (tp-0.0.0.0-80-8) [oreReportTutorialListener] BookstoreReportTutorialListener.beforeParseFilters: {"Undefined$Quantity Sold_OP":"Equal","ZBKS$Book$Title":"Learning"}Using this callback we can now add some custom logic. For example, let's assume that we want to prevent them from entering a filter with more than 10 characters. We can add such a validation:
public JSONObject beforeParseFilters(JSONObject filters) { LOG.info("BookstoreReportTutorialListener.beforeParseFilters: " + filters); String title = filters.optString("ZBKS$Book$Title"); if (title != null && title.length() > 10) { JSONArray errors = new JSONArray(); errors.put(new JSONObject().put("id", "ZBKS$Book$Title").put("msg", "Cannot accept a Title filter of more than 10 characters")); throw new RuntimeException(errors.toString()); } return super.beforeParseFilters(filters);}
See the javadocs for BaseReportResourceListener for more information on the hooks available and the usage patterns for validations, data manipulation, etc.