You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Mostafa Mohamed <es...@gmail.com> on 2009/08/16 16:55:54 UTC

WARN - Couldn't resolve model type, please set the type yourself.

Hi,

i have a form to add an item, i can select the type of this item from
a drop down choice and accordingly the fields specific to the item
will be replaced. before adding this line:

AjaxFormValidatingBehavior.addToAllFormComponents(form, "onblur");

everything worked perfectly, i would have my form validated. i'd find
the items added to the database and no problem seems to appear.

when i added this line to get ajax validation, after clicking on the
type in the drop down choice i'd get the following warning:

WARN org.apache.wicket.markup.html.form.AbstractTextComponent -
Couldn't resolve model type of
Model:classname=[org.apache.wicket.model.CompoundPropertyModel$AttachedCompoundPropertyModel]:nestedModel=[Model:classname=[org.apache.wicket.model.CompoundPropertyModel]:nestedModel=[Model:classname=[main.java.web.components.addedit.AddPublicationPanel$10]:attached=true:tempModelObject=[main.java.domain.publication.Article@745f]]]
for [MarkupContainer [Component id = ISBN]], please set the type
yourself.

followed by this exception:

WicketMessage: No get method defined for class: class
main.java.domain.publication.Article expression: ISBN

Root cause:

org.apache.wicket.WicketRuntimeException: No get method defined for
class: class main.java.domain.publication.Article expression: ISBN

the weird thing is that model of the form when printed is correct.

here is my .java:

public class AddPublicationPanel extends BasicPanel {

	// services
	@SpringBean
	private IDepartmentAccessService departmentAccessService;
	@SpringBean
	private IPublicationAccessService publicationAccessService;
	@SpringBean
	private IUserAccessService userAccessService;

	// lists used for DropDownChoice
	private List<Short> listYear;
	private List<Byte> listMonth;

	// components
	private Form form;
	private FeedbackPanel feedback;
	private AjaxFallbackButton clear;
	private WebMarkupContainer detailsBook, detailsConferencePaper,
			detailsTechnicalReport, detailsWorkshop, detailsArticle,
			detailsBookChapter, detailsCurrent;
	private LoadableDetachableModel book, conferencePaper, technicalReport,
			workshop, article, bookChapter;
	private FormComponentFeedbackBorder publicationTypeBorder;

	// common fields
	private DropDownChoice publicationType, year, month;
	private TextField title, keywords;
	private AutoCompleteTextFieldUser[] authors;
	private AjaxFallbackLink addAuthor, removeAuthor;
	private TextArea abstractText;
	private ListMultipleChoice departments;
	private CheckBox reproducible, passwordProtected;

	// book details
	private TextField bookISBN, bookSeries, bookEdition, bookVolume,
			bookPublisherName, bookPublisherAddress;

	// conference paper details
	private TextField conferencePaperBookTitle, conferencePaperPages,
			conferencePaperPublisherName, conferencePaperPublisherAddress,
			conferencePaperEditors, conferencePaperAddress,
			conferencePaperSponsors;

	// technical report details
	private DropDownChoice technicalReportType;
	private TextField technicalReportInstitutionName,
			technicalReportInstitutionAddress;

	// workshop details
	private TextField workshopName, workshopNumber, workshopAddress;

	// article details
	private TextField articleJournalName, articleVolume, articleIssue,
			articlePages;

	// book chapter details
	private TextField bookChapterTitle, bookChapterISBN, bookChapterSeries,
			bookChapterEdition, bookChapterVolume, bookChapterPublisherName,
			bookChapterPublisherAddress;

	// custom validators
	private PatternValidator pagesPatternValidator, keywordsPatternValidator;

	public AddPublicationPanel() {
		super("block", "Add Publication");

		initPatternValidators();
		initLists();
		initModels();
		initCommon();
		initDetails();
		
		AjaxFormValidatingBehavior.addToAllFormComponents(form, "onblur");
	}

	private void initCommon() {
		add((feedback = new FeedbackPanel("feedback")).setOutputMarkupId(true));
		add(form = new Form("form", new CompoundPropertyModel(book)) {
			protected void onSubmit() {

				setPublicationAuthors();
				setPublicationKeywords();
				setPublicationCreationDate();

				publicationAccessService.savePublication((IPublication) form
						.getModelObject());
				detailsCurrent.setVisible(false);
				clearAuthors();

			}
		});

		// publicationType
		publicationType = new DropDownChoice("publicationType", Arrays
				.asList(PublicationType.values()), new ChoiceRenderer(
				"displayName", "id"));
		publicationType.setRequired(true);
		publicationType.add(new AjaxFormComponentUpdatingBehavior("onchange") {
			@Override
			protected void onUpdate(AjaxRequestTarget target) {
				target.addComponent(feedback);
				target.addComponent(detailsArticle);
				target.addComponent(detailsBook);
				target.addComponent(detailsBookChapter);
				target.addComponent(detailsConferencePaper);
				target.addComponent(detailsTechnicalReport);
				target.addComponent(detailsWorkshop);

				if (((PublicationType) publicationType.getModelObject()) == null) {
					detailsCurrent.setVisible(false);
				} else {
					if (((PublicationType) publicationType.getModelObject())
							.getId() == 0) {
						replaceDetails(detailsArticle).setModel(
								new CompoundPropertyModel(article));
					} else {
						if (((PublicationType) publicationType.getModelObject())
								.getId() == 1) {
							replaceDetails(detailsBook).setModel(
									new CompoundPropertyModel(book));
						} else {
							if (((PublicationType) publicationType
									.getModelObject()).getId() == 2) {
								replaceDetails(detailsBookChapter).setModel(
										new CompoundPropertyModel(bookChapter));

							} else {
								if (((PublicationType) publicationType
										.getModelObject()).getId() == 3) {
									replaceDetails(detailsConferencePaper)
											.setModel(
													new CompoundPropertyModel(
															conferencePaper));

								} else {
									if (((PublicationType) publicationType
											.getModelObject()).getId() == 4) {
										replaceDetails(detailsTechnicalReport)
												.setModel(
														new CompoundPropertyModel(
																technicalReport));

									} else {
										if (((PublicationType) publicationType
												.getModelObject()).getId() == 5) {
											replaceDetails(detailsWorkshop)
													.setModel(
															new CompoundPropertyModel(
																	workshop));

										}
									}
								}
							}
						}
					}
				}

			}
		});
		form.add((publicationTypeBorder = new FormComponentFeedbackBorder(
				"publicationTypeBorder")).add(publicationType)
				.setOutputMarkupId(true));
		// addWithBorder("publicationTypeBorder", form, publicationType);

		// title
		addWithBorder("titleBorder", form, new TextField("title").setRequired(
				true).add(StringValidator.maximumLength(128)));
		// year
		form.add(new DropDownChoice("year", listYear));
		// month
		form.add(new DropDownChoice("month", listMonth, new ChoiceRenderer() {
			@Override
			public Object getDisplayValue(Object object) {
				return (new DateFormatSymbols().getMonths())[((Byte) object)
						.intValue()];
			}
		}));
		// abstractText
		addWithBorder("abstractTextBorder", form, new TextArea("abstractText")
				.add(StringValidator.maximumLength(2048)));
		// reproducible
		form.add(new CheckBox("reproducible"));
		// passwordProtected
		form.add(new CheckBox("passwordProtected"));
		// keywords
		addWithBorder("keywordsBorder", form, new TextField("keywords").add(
				keywordsPatternValidator).add(
				StringValidator.maximumLength(2048)));

		// authors (internal & external)
		authors = new AutoCompleteTextFieldUser[10];
		for (int i = 0; i < 10; i++) {
			(authors[i] = new AutoCompleteTextFieldUser("author" + i))
					.setOutputMarkupId(true)
					.setOutputMarkupPlaceholderTag(true);
			if (i == 0) {
				authors[i].setRequired(true).setVisible(true);
				addWithBorder("authorBorder", form, authors[0]);
			} else {
				authors[i].setVisible(false);
				form.add(authors[i]);
			}
		}

		form.add((addAuthor = (new AjaxFallbackLink("add") {

			@Override
			public void onClick(AjaxRequestTarget target) {

				int pointer;
				for (pointer = 0; pointer < 10; pointer++) {
					if (!authors[pointer].isVisible()) {
						break;
					}
				}
				if (pointer < 10) {
					authors[pointer].setVisible(true);
					if (pointer == 9)
						this.setVisible(false);
					if (pointer > 0)
						removeAuthor.setVisible(true);

					if (target != null) {
						target.addComponent(authors[pointer]);
						target.addComponent(removeAuthor);
						target.addComponent(this);
					}
				}

			}

		})).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true));
		form.add((removeAuthor = (new AjaxFallbackLink("remove") {

			@Override
			public void onClick(AjaxRequestTarget target) {

				int pointer;
				for (pointer = 0; pointer < 10; pointer++) {
					if (!authors[pointer].isVisible()) {
						break;
					}
				}
				pointer--;
				if (pointer > 0)
					authors[pointer].setVisible(false);
				if (pointer == 1)
					this.setVisible(false);
				if (pointer <= 9)
					addAuthor.setVisible(true);

				if (target != null) {
					target.addComponent(authors[pointer]);
					target.addComponent(addAuthor);
					target.addComponent(this);
				}

			}
		})).setVisible(false).setOutputMarkupId(true)
				.setOutputMarkupPlaceholderTag(true));

		// departments
		addWithBorder("departmentsBorder", form, new ListMultipleChoice(
				"departments", new LoadableDetachableModel() {

					@Override
					protected Object load() {

						return departmentAccessService.findAllDepartments();
					}

				}, new ChoiceRenderer("name", "id")).setRequired(true));

		// clear button
		form.add((new AjaxFallbackButton("clear", form) {

			@Override
			protected void onSubmit(AjaxRequestTarget target, Form form) {
				detailsCurrent.setVisible(false);
				form.clearInput();
				clearAuthors();

				if (target != null) {
					target.addComponent(form);
					for (AutoCompleteTextFieldUser author : authors) {
						target.addComponent(author);
					}
				}
			}

		}).setDefaultFormProcessing(false));

		// trying ajax
		/* new AjaxFormValidatingBehavior(form, "onkeystroke"); */

	}

	private void initModels() {
		book = new LoadableDetachableModel() {

			@Override
			protected Object load() {
				IBook book = new Book();
				// setting default values
				book.setYear(new Short((short) Calendar.getInstance().get(
						Calendar.YEAR)));
				book.setPublisher(new Publisher());
				return book;
			}
		};
		bookChapter = new LoadableDetachableModel() {

			@Override
			protected Object load() {
				IBookChapter bookChapter = new BookChapter();
				// setting default values
				bookChapter.setYear(new Short((short) Calendar.getInstance()
						.get(Calendar.YEAR)));
				bookChapter.setBookPublisher(new Publisher());
				return bookChapter;
			}

		};
		article = new LoadableDetachableModel() {

			@Override
			protected Object load() {
				IArticle article = new Article();
				// setting default values
				article.setYear(new Short((short) Calendar.getInstance().get(
						Calendar.YEAR)));
				return article;
			}
		};
		workshop = new LoadableDetachableModel() {

			@Override
			protected Object load() {
				IWorkshop workshop = new Workshop();
				// setting default values
				workshop.setYear(new Short((short) Calendar.getInstance().get(
						Calendar.YEAR)));
				return workshop;
			}
		};
		conferencePaper = new LoadableDetachableModel() {

			@Override
			protected Object load() {
				IConferencePaper conferencePaper = new ConferencePaper();
				// setting default values
				conferencePaper.setYear(new Short((short) Calendar
						.getInstance().get(Calendar.YEAR)));
				conferencePaper.setConferenceBookPublisher(new Publisher());

				return conferencePaper;
			}
		};
		technicalReport = new LoadableDetachableModel() {

			@Override
			protected Object load() {
				ITechnicalReport technicalReport = new TechnicalReport();
				// setting default values
				technicalReport.setYear(new Short((short) Calendar
						.getInstance().get(Calendar.YEAR)));
				technicalReport.setType(TechnicalReportType.PRIMARY_RESEARCH);
				technicalReport.setInstitution("GUC");
				technicalReport
						.setInstitutionAddress("New Cairo City, El Tagamoa El Khames");

				return technicalReport;
			}
		};
	}

	private void initDetails() {

		// article
		(detailsArticle = new WebMarkupContainer("detailsArticle")).setVisible(
				false).setOutputMarkupId(true).setOutputMarkupPlaceholderTag(
				true);

		addWithBorder("journalNameBorder", detailsArticle, new TextField(
				"journalName") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.maximumLength(128));
			}
		});
		addWithBorder("volumeBorder", detailsArticle, new TextField(
				"journalVolume") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(NumberValidator.range(0, Short.MAX_VALUE));
			}
		});
		addWithBorder("issueBorder", detailsArticle, new TextField(
				"journalIssue") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(NumberValidator.range(0, Long.MAX_VALUE));
			}
		});
		addWithBorder("pagesBorder", detailsArticle, new TextField(
				"journalPages") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(64));
				add(pagesPatternValidator);
			}
		});

		// book
		(detailsBook = new WebMarkupContainer("detailsBook")).setVisible(false)
				.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true);

		addWithBorder("ISBNBorder", detailsBook, new TextField("ISBN") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.lengthBetween(10, 13));
			}
		});
		addWithBorder("seriesBorder", detailsBook, new TextField("series") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(128));
			}
		});
		addWithBorder("editionBorder", detailsBook, new TextField("edition") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(64));
			}
		});
		addWithBorder("volumeBorder", detailsBook, new TextField("volume") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(NumberValidator.range(0, Short.MAX_VALUE));
			}
		});
		addWithBorder("publisherNameBorder", detailsBook, new TextField(
				"publisher.name") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.maximumLength(128));
			}
		});
		addWithBorder("publisherAddressBorder", detailsBook, new TextField(
				"publisher.address") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(128));
			}
		});

		// book chapter
		(detailsBookChapter = new WebMarkupContainer("detailsBookChapter"))
				.setVisible(false).setOutputMarkupId(true)
				.setOutputMarkupPlaceholderTag(true);

		addWithBorder("bookISBNBorder", detailsBookChapter, new TextField(
				"bookISBN") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.lengthBetween(10, 13));
			}
		});
		addWithBorder("bookTitleBorder", detailsBookChapter, new TextField(
				"bookTitle") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.maximumLength(128));
			}
		});
		addWithBorder("seriesBorder", detailsBookChapter, new TextField(
				"bookSeries") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(128));
			}
		});
		addWithBorder("editionBorder", detailsBookChapter, new TextField(
				"bookEdition") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(64));
			}
		});
		addWithBorder("volumeBorder", detailsBookChapter, new TextField(
				"bookVolume") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(NumberValidator.range(0, Short.MAX_VALUE));
			}
		});
		addWithBorder("pagesBorder", detailsBookChapter, new TextField(
				"bookPages") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.maximumLength(64));
				add(pagesPatternValidator);
			}
		});
		addWithBorder("publisherNameBorder", detailsBookChapter, new TextField(
				"bookPublisher.name") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.maximumLength(128));
			}
		});
		addWithBorder("publisherAddressBorder", detailsBookChapter,
				new TextField("bookPublisher.address") {
					@Override
					public void onBeforeRender() {
						super.onBeforeRender();
						add(StringValidator.maximumLength(128));
					}
				});

		// conference paper
		(detailsConferencePaper = new WebMarkupContainer(
				"detailsConferencePaper")).setVisible(false).setOutputMarkupId(
				true).setOutputMarkupPlaceholderTag(true);

		addWithBorder("conferenceBookTitleBorder", detailsConferencePaper,
				new TextField("conferenceBookTitle") {
					@Override
					public void onBeforeRender() {
						super.onBeforeRender();
						setRequired(true);
						add(StringValidator.maximumLength(128));
					}
				});
		addWithBorder("conferenceAddressBorder", detailsConferencePaper,
				new TextField("conferenceAddress") {
					@Override
					public void onBeforeRender() {
						super.onBeforeRender();
						add(StringValidator.maximumLength(128));
					}
				});
		addWithBorder("pagesBorder", detailsConferencePaper, new TextField(
				"conferenceBookPages") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(64));
				add(pagesPatternValidator);
			}
		});
		addWithBorder("editorsBorder", detailsConferencePaper, new TextField(
				"editors") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(256));
			}
		});
		addWithBorder("sponsorsBorder", detailsConferencePaper, new TextField(
				"sponsors") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(512));
			}
		});
		addWithBorder("publisherAddressBorder", detailsConferencePaper,
				new TextField("conferenceBookPublisher.address") {
					@Override
					public void onBeforeRender() {
						super.onBeforeRender();
						add(StringValidator.maximumLength(128));
					}
				});
		addWithBorder("publisherNameBorder", detailsConferencePaper,
				new TextField("conferenceBookPublisher.name") {
					@Override
					public void onBeforeRender() {
						super.onBeforeRender();
						setRequired(true);
						add(StringValidator.maximumLength(128));
					}
				});

		// technical report
		(detailsTechnicalReport = new WebMarkupContainer(
				"detailsTechnicalReport")).setVisible(false).setOutputMarkupId(
				true).setOutputMarkupPlaceholderTag(true);

		addWithBorder("typeBorder", detailsTechnicalReport, new DropDownChoice(
				"type", Arrays.asList(TechnicalReportType.values()),
				new ChoiceRenderer("displayName", "id")));
		addWithBorder("institutionBorder", detailsTechnicalReport,
				new TextField("institution") {
					@Override
					public void onBeforeRender() {
						super.onBeforeRender();
						setRequired(true);
						add(StringValidator.maximumLength(128));
					}
				});
		addWithBorder("institutionAddressBorder", detailsTechnicalReport,
				new TextField("institutionAddress") {
					@Override
					public void onBeforeRender() {
						super.onBeforeRender();
						add(StringValidator.maximumLength(128));
					}
				});

		// workshop
		(detailsWorkshop = new WebMarkupContainer("detailsWorkshop"))
				.setVisible(false).setOutputMarkupId(true)
				.setOutputMarkupPlaceholderTag(true);

		addWithBorder("workshopTitleBorder", detailsWorkshop, new TextField(
				"workshopTitle") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				setRequired(true);
				add(StringValidator.maximumLength(128));
			}
		});
		addWithBorder("workshopNumberBorder", detailsWorkshop, new TextField(
				"workshopNumber") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(NumberValidator.range(0, Long.MAX_VALUE));
			}
		});
		addWithBorder("workshopAddressBorder", detailsWorkshop, new TextField(
				"workshopAddress") {
			@Override
			public void onBeforeRender() {
				super.onBeforeRender();
				add(StringValidator.maximumLength(128));
			}
		});

		detailsCurrent = detailsBook;

		form.add(detailsArticle).add(detailsBook).add(detailsBookChapter).add(
				detailsConferencePaper).add(detailsConferencePaper).add(
				detailsTechnicalReport).add(detailsWorkshop);

	}

	private void initLists() {

		// years
		listYear = new ArrayList<Short>();
		for (short i = (short) Calendar.getInstance().get(Calendar.YEAR); i
>= 1950; i--) {
			listYear.add(new Short(i));
		}

		// months
		listMonth = new ArrayList<Byte>();
		for (byte i = 0; i < 12; i++) {
			listMonth.add(new Byte((byte) i));
		}
	}

	private void initPatternValidators() {
		pagesPatternValidator = new PatternValidator(
				"(\\s*\\d+\\s*((\\s*-\\s*\\d+)?\\s*[,;]?\\s*))*");
		keywordsPatternValidator = new PatternValidator(
				"(\\s*\\w+\\s*,*\\s*)*,*\\s*");
	}

	private void addWithBorder(String id, WebMarkupContainer parent,
			FormComponent formComponent) {
		final FormComponentFeedbackBorder border = new FormComponentFeedbackBorder(
				id);
		border.setOutputMarkupId(true);
		border.add(formComponent);
		parent.add(border);
		formComponent.add(new AjaxFormComponentUpdatingBehavior("onkeyup") {

			@Override
			protected void onUpdate(AjaxRequestTarget target) {
				target.addComponent(feedback);
				target.addComponent(border);
			}

		});
	}

	private Form replaceDetails(WebMarkupContainer replacement) {

		detailsCurrent.setVisible(false);
		(detailsCurrent = replacement).setVisible(true);
		return form;
	}

	private void setPublicationAuthors() {
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < authors.length; i++) {
			if (!authors[i].isVisible())
				break;
			if (authors[i].getModelObject() != null) {
				IUser user = userAccessService.getUserByFullName(authors[i]
						.getModelObjectAsString());
				if (i != 0) {
					builder.append("#");
				}
				if (user != null) {
					builder.append(user.getId());
					((IPublication) form.getModelObject())
							.addInternalAuthor(user);
				} else {
					builder.append(authors[i].getModelObjectAsString());
				}
			}
		}
		((IPublication) form.getModelObject()).setAuthors(builder.toString());
	}

	private void setPublicationKeywords() {
		String keywords = null;
		if (((IPublication) form.getModelObject()).getKeywords() != null) {
			keywords = ((IPublication) form.getModelObject()).getKeywords()
					.trim();
			keywords += (keywords.charAt(keywords.length() - 1) != ',' ? ","
					: "");
		}
		((IPublication) form.getModelObject()).setKeywords(keywords);
	}

	private void setPublicationCreationDate() {
		((IPublication) form.getModelObject()).setCreatedOn(new Date());
	}

	private void clearAuthors() {
		for (AutoCompleteTextFieldUser author : authors) {
			author.clear();
		}
	}

}

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org