Hi Thiago, Thanks for your answer,
In my application each user (identified by a userId in the session) is assigned a task. Each task has stages which consist of reading a text and answering a quiz about it. The text and quiz that you are assigned in each stage is not the same for everybody, but randomly picked among several candidates (the random number is generated when the task is assigned to you). So the text and quiz I receive in stage 1 may be different from the text and quiz you receive in stage 1. Texts and quizzes are stored in XML files. The time you have to solve a stage is limited and the time that you have to complete the whole task is also limited. We want to track this behaviour of reading the text and solving the quiz. Now I don't have my code here, but the pseudocode of a stage is something like this: public Object onActivate() { myTask = getCurrentTaskOfUser(userId); if (myTask == null) { return ErrorPage.class; } myCurrentStage = getCurrentStage(task); if (stage == null) { return TaskFinished.class } textFile = getTextFile(myCurrentStage,myTask.getRandomNumber()); text = parseXML(textFile); } public Object onSubmit() { if (System.currentTimeMillis() > myTask.getDeadline()) { return TaskFailedPage.class; } else if (System.currentTimeMillis() > myCurrentStage.getDeadline()) { return TaskFailedPage.class; } else { service.saveAnswersOfQuiz(); service.advanceStage(myTask); return Stage.class; } } public void afterRender() { // Add javascript that does forward() to the browser so you can't come back to this stage by pressing "back" on the browser. // Add javascript that shows a chronometer on the screen // Add javascript that enables mouse tracking } onTrack(@RequestParameter(...) mouseX, @RequestParameter(...) mouseY) { trackingService.saveInteraction(myStage, mouseX, mouseY); } So if I move the code of the task from onActivate() to setupRender() as Geoff suggested, I will not have the task on onSubmit() anymore, so I cannot check whether the user finished before the deadline. A solution is getting the task from database both on setupRender() and onSubmit(), but I don't know if this is more efficient than leave the code in onActivate(). And after much thinking, maybe the onTracking() should stop tracking when the time is over to avoid unnecessary processing. In that case I would also need the task and the stage in onTrack(). The point is, I wanted the task and the stage and the text/quiz to be obtained only once from the database, and kept in memory until the user finishes the stage. The objects are big and storing them in the session may be a bit overkill. Maybe make a cache in the server (concurrent HashMap<userId, currentTask>) is the solution? In principle, the number of users that can use my app is limited let us say less than 300 so maybe such a cache is viable. How do you think? El 08/04/17 a las 04:43, Thiago H. de Paula Figueiredo escribió: > On Fri, Apr 7, 2017 at 1:12 PM, Phyambre <phy....@gmail.com> wrote: > >> Hi Thiago, >> > > Hi! > > >> Thanks for your email. >> >> 1) I am not using form submissions for that. I am using input hidden >> fields as temporary variables because the input hidden seem to be >> visible from zone-updater.js while the javascript library (not module) I >> am using for the mouse tracking is not, and I don't know why. Should I >> include the library in the "require" of the zone-updater.js? how can I >> do that if it is not in META-INF/assets? >> > > Most probably yes. At least it makes everything consistent. > > >> 2) I read the document you suggest. It seems interesting but I can't >> fully understand it. I think you mean this snippet. >> >> How can I transform it to call my onTrack method when on mouse move >> occurs on any p of a certain class "trackedParagraph"? I don't need to >> process any response since onTrack just saves things in a DB. Maybe >> something like this? >> >> require(["t5/core/ajax", "jquery"], function (ajax, $) { >> $('p.trackedParagraph').mousemove(function() { >> ajax('track'), { >> mouseX: $('#mouseXField'), >> mouseY: $('#mouseYField'), >> ... >> queryParameterName: $('#fieldName') >> }); >> }); >> }); >> >> Would something like that work? Sorry, maybe my problem is that I am not >> familiar with jQuery notation. >> > > Yes, I believe you're in the right path, except for a little error in the > line below: > ajax('track'), { > It should be > ajax('track', { > > And adding an element: null or element: [some element] to the object you're > passing as the second parameter of ajax(). > > >> And more important. Will this avoid calling onActivate() again on the >> page? Because my current solution seems to work, but the biggest >> efficiency problem is that every AJAX call executes onActivate(). >> > > No. onActivate() is called for every request to the page, regardless if > it's an event or page render one. You need to remove the expensive code > from onActivate(), or at least only call it when needed. You haven't posted > any Java code or pseudocode, so it's hard to help you further. > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org