Hi everybody,
Ihave some issue going one with a large project that I have to do.
It’s about a form of a class Measure. This class has properties:
id [long]
name [String]
measureType [MeasureType]
sourceField [String]
ordinal [int]
measureGroup [MeasureGroup]
datType [DataType]
zeroSignificant [boolean]
The database is Oracle 10, I talk to it with Hibernate, via DAO and Service layer, and everything is Spring managed in a multi-module Maven project. The presentation layer is off course Vaadin.
Because it will be a very large GUI app, I try to scale everything up, though until now, I managed to work without add-ons.
I have a view with a combobox and a form. Each time you change the value of the combobox,the value of the form changes with. You choose a Measure, and it’s props are shown. Until there, everything works fine.
But when I save Measure (i.e. commit() then the fields like String and int are nicely changed, but not the fields that represent another type. These fields are in my form an Optiongroup (MeasureType: 2 values), and 2 Comboboxes (DataType: 6 values and MeasureGroup: 750 values). The Measures are managed by MeasureContainer (with an inject of MeasureService), and all the 3 other types have a container as well; with each time the service-class injected (e.g.: DataTypeContainer with DataTtpeService).
Here is the code:
MeasureForm
@SuppressWarnings("serial")
@Configurable(preConstruction = true)
public class MeasureForm extends Form implements ClickListener {
// private static final long serialVersionUID = 1L;
@Autowired
private transient MeasureContainer measureContainer;
@Autowired
private transient MeasureTypeContainer measureTypeContainer;
@Autowired
private transient DataTypeContainer dataTypeContainer;
@Autowired
private transient MeasureGroupContainer measureGroupContainer;
private static final String NULL_STRING = "";
private static final String CAPTION_MEASURE_FORM = "Measure form";
private static final String CAPTION_MEASURE_TYPE = "Measure type";
private static final String CAPTION_SOURCE_FIELD = "Source field";
private static final String CAPTION_MEASURE_GROUP = "Measure group";
private static final String CAPTION_DATATYPE = "Datatype";
private static final String CAPTION_ZERO_SIGNIFICANT = "Zero significant";
private static final String BUTTON_SAVE = "Save";
private static final String BUTTON_EDIT = "Edit";
private static final String BUTTON_RESET = "Reset";
private static final String BUTTON_CANCEL = "Cancel";
private static final String ERROR_REQUIRED_NAME = "Name of the measure is required!";
private static final String ERROR_REQUIRED_MEASURE_TYPE = "Measure type is required!";
private static final String STYLE_OPTIONGROUP_HORIZONTAL = "horizontal";
private static final String OPTION_PHYSICAL = "physical";
private static final float COMMON_TEXT_FIELD_WIDTH = 20f;
private static final float COMMON_NUM_FIELD_WIDTH = 5f;
BeanItem<Measure> measureItem;
private Long measureId = null;
private Button saveButton = new Button(BUTTON_SAVE);
private Button editButton = new Button(BUTTON_EDIT);
private Button resetButton = new Button(BUTTON_RESET);
private Button cancelButton = new Button(BUTTON_CANCEL);
private TextField inputName;
private TextField inputSourceField;
private TextField inputOrdinal;
private ComboBox selectOrInputMeasureGroup;
private CheckBox checkZeroSignificant;
private OptionGroup selectMeasureType;
private ComboBox selectDataType;
// to edit measures
public MeasureForm(long measureId) {
this.measureId = Long.valueOf(measureId);
initializeForm();
setupFields();
}
// for new measures
public MeasureForm() {
this.measureId = null;
initializeForm();
setupFields();
}
private void initializeForm() {
setCaption(CAPTION_MEASURE_FORM);
setWriteThrough(false);
HorizontalLayout buttonFooter = new HorizontalLayout();
buttonFooter.setSpacing(true);
buttonFooter.addComponent(editButton);
buttonFooter.addComponent(saveButton);
buttonFooter.addComponent(resetButton);
buttonFooter.addComponent(cancelButton);
saveButton.addListener((ClickListener)this);
setFooter(buttonFooter);
getFooter().setMargin(false, false, true, true);
}
public void changeMeasure(long newMeasureId) {
setMeasureId(newMeasureId);
setupFields();
}
private void setupFields() {
Measure measure;
if (measureId != null) {
measureItem = measureContainer.getItem(measureId);
} else {
measure = new Measure();
measureItem = new BeanItem<Measure>(measure); //********** 1 regel omhoog geplaatst (binnen else) *******
}
setItemDataSource(measureItem);
setVisibleItemProperties(MeasureContainer.NATURAL_COL_ORDER);
inputName = ((TextField) getField("name"));
inputName.setRequired(true);
inputName.setRequiredError(ERROR_REQUIRED_NAME);
inputName.setWidth(COMMON_TEXT_FIELD_WIDTH, UNITS_EM);
inputName.setNullRepresentation(NULL_STRING);
setupSelectMeasureType();
removeItemProperty("measureType");
addField("measureType", selectMeasureType);
selectMeasureType.setRequired(true);
selectMeasureType.setRequiredError(ERROR_REQUIRED_MEASURE_TYPE);
selectMeasureType.setCaption(CAPTION_MEASURE_TYPE);
//selectMeasureType.addStyleName(STYLE_OPTIONGROUP_HORIZONTAL); // ??? op 1 lijn zetten ??? !!! no stylesheet definded yet !!!
selectMeasureType.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
selectMeasureType.setItemCaptionPropertyId("name");
selectMeasureType.setNewItemsAllowed(false);
selectMeasureType.setWriteThrough(false);
selectMeasureType.setImmediate(true);
selectMeasureType.setReadThrough(true);
inputSourceField = ((TextField) getField("sourceField"));
inputSourceField.setCaption(CAPTION_SOURCE_FIELD);
inputSourceField.setWidth(COMMON_TEXT_FIELD_WIDTH, UNITS_EM);
inputSourceField.setNullRepresentation(NULL_STRING);
inputOrdinal = ((TextField) getField("ordinal"));
inputOrdinal.setWidth(COMMON_NUM_FIELD_WIDTH, UNITS_EM);
inputOrdinal.setNullRepresentation(NULL_STRING);
//*
setupSelectOrInputMeasureGroup();
removeItemProperty("measureGroup");
addField("measuerGroup", selectOrInputMeasureGroup);
selectOrInputMeasureGroup.setCaption(CAPTION_MEASURE_GROUP);
selectOrInputMeasureGroup.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
selectOrInputMeasureGroup.setItemCaptionPropertyId("name");
selectOrInputMeasureGroup.setWidth(COMMON_TEXT_FIELD_WIDTH, UNITS_EM);
selectOrInputMeasureGroup.setImmediate(true);
selectOrInputMeasureGroup.setReadThrough(true);
//*/
setupSelectDataType();
removeItemProperty("dataType");
addField("dataType", selectDataType);
selectDataType.setCaption(CAPTION_DATATYPE);
selectDataType.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY);
selectDataType.setItemCaptionPropertyId("name");
selectDataType.setNewItemsAllowed(false);
selectDataType.setNullSelectionAllowed(true);
selectDataType.setImmediate(true);
selectDataType.setWriteThrough(false);
selectDataType.setReadThrough(true);
checkZeroSignificant = (CheckBox)getField("zeroSignificant");
checkZeroSignificant.setCaption(CAPTION_ZERO_SIGNIFICANT);
if (this.getMeasureId() == null) {
System.out.println("In select physical method");
selectMeasureType.select(1l);
} else {
selectMeasureType.setValue(measureItem.getBean().getMeasureType().getId());
if(measureItem.getBean().getDataType()!=null){
selectDataType.setValue(measureItem.getBean().getDataType().getId());
}
if(measureItem.getBean().getMeasureGroup()!=null){
selectOrInputMeasureGroup.setValue(measureItem.getBean().getMeasureGroup().getId());
}
}
//Some console output do do some provisional logging
System.out.println(getItemPropertyIds());
for(Object id:getItemPropertyIds()){
System.out.println("["+id+"]
"+getItemProperty(id));
}
for(long id:new long[]{689l, measureId}){
BeanItem<Measure> item = measureContainer.getItem(id);
Measure m = item.getBean();
System.out.println(m.getId() + " - " + m.getMeasureType() + " - " + m.getDataType()+ " - " + m.getName() + " - "+m.getSourceField());
}
}
private void setupSelectMeasureType() {
selectMeasureType = new OptionGroup();
selectMeasureType.setContainerDataSource(measureTypeContainer);
}
private void setupSelectDataType() {
selectDataType = new ComboBox();
selectDataType.setContainerDataSource(dataTypeContainer);
}
private void setupSelectOrInputMeasureGroup () {
selectOrInputMeasureGroup = new ComboBox();
selectOrInputMeasureGroup.setContainerDataSource(measureGroupContainer);
}
public Long getMeasureId() {
return measureId;
}
private void setMeasureId(Long measureId) {
this.measureId = measureId;
}
private void setMeasureId(long measureId) {
Long measureIdAsLong = Long.valueOf(measureId);
setMeasureId(measureIdAsLong);
}
public Button getSaveButton() {
return saveButton;
}
public Button getResetButton() {
return resetButton;
}
public Button getCancelButton() {
return cancelButton;
}
public void buttonClick(ClickEvent event) {
final Button source = event.getButton();
if (source==this.saveButton){
saveMeasure();
}else if(source==this.resetButton){
}else if(source==this.cancelButton){
}
}
private void saveMeasure() {
commit();
//Again some logging in the console to check the progam while dubugging
System.out.println("In save method!");
BeanItem<Measure> item = measureContainer.getItem(689l);
Measure m = item.getBean();
System.out.println(m.getId() + " - " + m.getMeasureType() + " - " + m.getDataType()+ " - " + m.getName() + " - "+m.getSourceField());
}
}
MeasureContainer
@SuppressWarnings("serial")
@Configurable(preConstruction = true)
@Component
public class MeasureContainer extends BeanContainer<Long,Measure> implements
Serializable {
// private static final long serialVersionUID = 1L;
@Autowired
private transient MeasureService measureService;
public static final Object[] NATURAL_COL_ORDER = {"id", "name", "measureType", "sourceField", "ordinal", "measureGroup", "dataType", "zeroSignificant"};
public MeasureContainer() {
super(Measure.class);
initializeMeasureContainer();
}
private void initializeMeasureContainer(){
//set BeanIdReslover
setBeanIdProperty("id");
//populate container
List<Measure>measures=measureService.findAll();
addAll(measures);
}
//Hibernate storing code stiil has to be placed, I first talk with the container
}
DataTypeContainer
@SuppressWarnings("serial")
@Configurable(preConstruction = true)
@Component
public class DataTypeContainer extends BeanContainer<Long, DataType> implements
Serializable {
// private static final long serialVersionUID = 1L;
private static final String[] NATURAL_COL_ORDER = { "id", "name" };
@Autowired
private transient DataTypeService dataTypeService;
public DataTypeContainer() {
super(DataType.class);
initDataTypeContainer();
}
private void initDataTypeContainer() {
setBeanIdProperty("id");
List<DataType> dataTypes = dataTypeService.find();
addAll(dataTypes);
}
}
When I preform a commit(), the code runs, I get no errors at all, and all my single (i.e. String, int, …) fields are well fixed in the container. But when I click to another measure and then click back to the measure I changed, only the single fields are changed.
I think (or better hope) this can be fixed by overridng a setValue() method somewhere, but untill now I didn’t manage to find which one …
After some days now and the I become desparous.
Thank for trying to help me out.
I’ll be very gracefull to the person that gives me the hint int the right direction!