Hi again ;)

I have another problem with seam. Is there a way to force seam to run some 
method before it redirects to the page ? And is it possible that seam is 
cache`ing lists used as datamodels ?

If you are a bit confussed, let me explain.

Here I have my view

  | <h:dataTable styleClass="dataTable" columnClasses="categoryName" 
var="question" value="#{cat.questionList}">
  |                                     <h:column>
  |                                         <h:outputText 
value="#{question.questionText}"/>
  |                                     </h:column>
  |                                     <h:column>
  |                                         <h:commandButton type="button" 
image="./images/tbl_ico_del.png" style="border: none" 
action="#{QuestionController.removeQuestion(question)}"/>
  |                                     </h:column>
  |                                 </h:dataTable>
  | 

As U can see it uses questionCategoryList generated by the bean below.


  | @Stateless
  | @Name("QuestionCategoryController")
  | public class QuestionCategoryControllerBean implements 
QuestionCategoryController {
  |     
  |     @Logger
  |     private Log log;
  |     
  |     @In(create = true)
  |     private QuestionCategoryManager questionCategoryManager;
  |     
  |     @In(create = true)
  |     private QuestionCategory questionCategory;
  |     
  |     @DataModel
  |     private List<QuestionCategory> questionCategoryList;
  |     
  |     @In(required = true)
  |     private FieldValidator fieldValidator;
  |     
  |     public void addCategory() {
  |         
if(fieldValidator.validate(questionCategory,"addCategoryForm","categoryName")) {
  |             questionCategoryManager.addCategory(this.questionCategory);
  |             this.questionCategory = null;
  |             this.questionCategoryList = null;
  |         }
  |     }
  |     
  |     @SuppressWarnings("unchecked")
  |     public void removeSelectedCategories() {
  |         QuestionCategory qc;
  |         Iterator it = questionCategoryList.iterator();
  | 
  |         while(it.hasNext()) {
  |             qc = (QuestionCategory) it.next();
  |             
  |             if(qc.isSelected()) {
  |                 questionCategoryManager.removeCategory(qc);
  |             }
  |         }
  | 
  |         this.questionCategoryList = null;
  |     }
  |     
  |     public void removeCategory(QuestionCategory questionCategory) {
  |         questionCategoryManager.removeCategory(questionCategory);
  |         this.questionCategory = null;
  |         this.questionCategoryList = null;
  |     }
  | 
  |     public QuestionCategory getQuestionCategory() {
  |         return questionCategory;
  |     }
  | 
  |     public void setQuestionCategory(QuestionCategory questionCategory) {
  |         this.questionCategory = questionCategory;
  |     }
  |     
  |     @Factory("questionCategoryList")
  |     public void createQuestionCategoryList() {
  |         this.questionCategoryList = 
this.questionCategoryManager.getAllQuestionCategories();
  |     }
  |     
  |     @Remove
  |     public void destroy() {
  |     }
  | }
  | 

Well the view works, and it renders ok, but the problem is when I want to 
remove a question from the category by running 
#{QuestionController.removeQuestion(question)} from the view.

The question is removed from the database, but when the page reloads, it`s 
still in the list !

I`m removing question by using another bean

  | @Stateless
  | @Name("questionManager")
  | public class QuestionManagerBean implements QuestionManager {
  |     
  |     @Logger
  |     Log log;
  |     
  |     @In
  |     private EntityManager entityManager;
  |     
  |     public void addQuestion(Question question) {
  |         question.setCreated(new Date());
  |         entityManager.persist(question);
  |         log.info("Question successfully persisted. [" + 
question.getQuestionText() + "]");
  |     }
  | 
  |     public void removeQuestion(Question question) {
  |         log.info("Removing question [" + question.getQuestionText() + "]");
  |         entityManager.flush();
  |         entityManager.remove(entityManager.merge(question));
  |     }
  | 
  |     public Question getQuestion(Question question) {
  |         return null;
  |     }
  |     
  |     @SuppressWarnings("unchecked")
  |     public List<Question> getAllQuestions() {
  |         return entityManager.createQuery("from Question q").getResultList();
  |     }
  |     
  |     @Remove 
  |     public void destroy() {}
  |     
  | }
  | 

After putting some breakepoints and running this metod from view I found this:

  | 17:04:36,893 INFO  [QuestionCategoryManagerBean] Reciving QuestionCategory 
list
  | 17:04:37,494 INFO  [QuestionManagerBean] Removing question [hdfghdfghf]
  | 

As far as I`m concerned, as the questionCategoryList is generated by a 
stateless bean, the list has to be recived from the database everytime my code 
recals to it. So as I want to remove question from some category, seam needs to 
get current list from the database, then lazy-fetch the question, inject it to 
the metod, and pass to  the removeQuestion method in the questionManagerBean. 
It`s allright, but why Seam isn`t refreshing the list after the question is 
removed ? I mean that even though question is removed form the database, the 
list rendered as dataModel on view by dataTable, just after reloading the page, 
the question is still on the list. But what is strange, when I hit reload on my 
browser (F5 or sth) the list is recived from the database once again and 
rendered view is correct, without removed question !

I`ve tryed a couple of my ideas (including <action 
execute="refresh_this_stupid_list> setted in the view section in pages.xml)  to 
fix this crap, even something like this

  | @In(value="#{questionCategoryList}")
  | private ListDataModel tmp;
  | .
  | .
  | .
  | public void removeQuestion(Question question) {
  |         
if(question.getQuestionType().getId().equals(questionTypeManager.getQuestionTypeByName(propertiesManager.get("questiontype.input")).getId()))
 {
  |             questionManager.removeQuestion(question);
  |         } else {            
  |             answerManager.removeAnswers(question.getAnswers());
  |             questionManager.removeQuestion(question);
  |         }
  |         
tmp.setWrappedData(questionCategoryManager.getAllQuestionCategories());
  |     }
  | 

But even though that in logs it looked allright

  | 17:04:36,893 INFO  [QuestionCategoryManagerBean] Reciving QuestionCategory 
list
  | 17:04:37,494 INFO  [QuestionManagerBean] Removing question [hdfghdfghf]
  | 17:04:37,516 INFO  [QuestionCategoryManagerBean] Reciving QuestionCategory 
list
  | 

The list rendered on the view, wasn`t refreshed and contained removed question.

Any idea how to work this thing out ?

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4123100#4123100

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4123100
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to