Client data to server

Hi,

I am creating add-on which create custom forms and user can fill fields from it e.g questionnaire. I have done almost everything else but I have problem to get data from UI to server side. I have tried to use rpc or state but always no correct result. What is the best practice? I am using Vaadin 7.

This questionnaire will always contain one submit button. After submit button click will questionnaire add-on contain user answers for further handling. Button click handling works fine.

I attach here small part from application where add-on is used so you can figure my idea better. I also attach my current situation from server and client codes. Those doesn’t work either.


// Application
final Questionnaire questionnaire = new Questionnaire("Testing addon");
questionnaire.setDescription("This is questionnaire testing.");
Question q1 = new Question("Your name"); // Textfield is default
List<Question> questionSet = new ArrayList<Question>();
questionSet.add(q1);

Question q2 = new Question("Interestings", QuestionType.CHECKBOX);
q2.addAnswer("Sports");
q2.addAnswer("Music");
q2.addAnswer("Movies");
q2.addAnswer("Books");
questionSet.add(q2);

// Here we set questions
questionnaire.setQuestionSet(questionSet);

questionnaire.addClickListener(new SubmitButtonClickListener() {
            @Override
            public void buttonClick(SubmitButtonClickEvent event) {
                // This is part where I can't get any data
                final List<Answer> answers = questionnaire.getUserAnswers();
                if (answers != null) {
                   // iterate thru and populate answers.
                } else {
                   // Show no data text
                }
            }
        });

// Server side
public class Questionnaire extends com.vaadin.ui.AbstractComponent {
...
    public void setQuestionSet(List<Question> questionSet) {
        this.getState().setQuestionSet(questionSet);
        this.getState().setAnswersAvailable(false);
        markAsDirty();
    }

    public List<Answer> getUserAnswers() {
        return getState().getUserAnswers();
    }
...
}

@Connect(Questionnaire.class)
public class QuestionnaireConnector extends AbstractComponentConnector {
QuestionnaireServerRpc serverRpc = RpcProxy.create(
            QuestionnaireServerRpc.class, this);

    public QuestionnaireConnector() {
        getWidget().addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                final MouseEventDetails mouseDetails = MouseEventDetailsBuilder
                        .buildMouseEventDetails(event.getNativeEvent(),
                                getWidget().getElement());
                // This will cause event fire
                serverRpc.submitButtonClicked(mouseDetails);
            }
        });
    }

    @Override
    public void onStateChanged(StateChangeEvent stateChangeEvent) {
        super.onStateChanged(stateChangeEvent);
        if (getState().isAnswersAvailable() == false) {
            getWidget().setQuestions(getState().getQuestionSet());
        } else {
            getState().setUserAnswers(getWidget().getUserAnswers());
        }
    }
...
}

// Client side
public class QuestionnaireWidget extends VerticalPanel {
...
    public void addClickHandler(ClickHandler clickHandler) {
        this.submitButton.addClickHandler(clickHandler);
    }

    public List<Answer> getUserAnswers() {
        List<Answer> answers = new ArrayList<Answer>();
        for (QuestionControl qc : this.questionControls) {
            Answer answer = new Answer();
            answer.setQuestionId(qc.getId());
            answer.setValue(qc.getUserAnswer());
            answers.add(answer);
        }
        return answers;
    }
...
}

State is unidirectional. You must send the answers witc rpc from client to server.