public class LuceneDocumentModel implements IComponentInheritedModel { Document doc; public LuceneDocumentModel(Document doc) { this.doc = doc; } public IWrapModel wrapOnInheritance(Component component) { return new WrapLuceneFieldModel(doc, component.getId(), false); } public Object getObject() { return doc; } public void setObject(Object object) { doc = (Document)object; } public void detach() { } public class WrapLuceneFieldModel extends LuceneFieldModel implements IWrapModel { public IModel getWrappedModel() { return LuceneDocumentModel.this; } public WrapLuceneFieldModel(Document doc, String fieldName, boolean multivalued) { super(doc, fieldName, multivalued); } } } public class LuceneFieldModel extends Model implements IWrapModel { Document doc; String fieldName; boolean multivalued; /** * @param doc Pass null if you wish to override {@link #getWrappedModel()} * @param fieldName * @param multivalued */ public LuceneFieldModel(Document doc, String fieldName, boolean multivalued) { this.doc = doc; this.fieldName = fieldName; this.multivalued = multivalued; } public IModel getWrappedModel() { throw new RuntimeException("Document is null and getWrappedModel() is not overriden!"); } public Object getObject() { if (doc == null) { IModel model = getWrappedModel(); if (model == null) return null; doc = (Document)model.getObject(); } String[] fieldValues = doc.getValues(fieldName); // return fieldValue == null ? "" : fieldValue; if (fieldValues == null) return null; if (multivalued) return Arrays.asList(fieldValues); if (fieldValues.length > 0) return fieldValues[0]; return null; } public void setObject(Object object) { if (doc == null) doc = (Document)getWrappedModel().getObject(); doc.removeField(fieldName); if (object != null) { if (multivalued) Lucene.addMultiValueField(doc, fieldName, (String[]) ((Collection) object).toArray(new String[0])); else Lucene.addField(doc, fieldName, object.toString()); } } } DropDownChoice choice = new DropDownChoice("choice", new LuceneFieldModel(null, fieldName, false) { @Override public IModel getWrappedModel() { return getInnermostModel(); } }, new Model() { @Override public Object getObject() { return new ArrayList(Lucene.getAllByUniqueField(fieldName).keySet()); } });