package org.orienteer.core.component.meta; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.WicketTag; import org.apache.wicket.markup.html.WebComponent; import org.apache.wicket.markup.parser.filter.WicketTagIdentifier; import org.apache.wicket.markup.resolver.IComponentResolver; import org.apache.wicket.model.IModel; import org.apache.wicket.util.string.Strings; import org.orienteer.core.component.property.DisplayMode; import ru.ydn.wicket.wicketorientdb.model.ODocumentPropertyModel; import ru.ydn.wicket.wicketorientdb.model.OPropertyModel; import com.orientechnologies.orient.core.db.record.OIdentifiable; import com.orientechnologies.orient.core.metadata.schema.OProperty; import com.orientechnologies.orient.core.record.impl.ODocument; /** * {@link IComponentResolver} to be able to handle wicket:property tags */ public class WicketPropertyResolver implements IComponentResolver { public static final String PROPERTY = "property"; static { WicketTagIdentifier.registerWellKnownTagName(PROPERTY); } @Override public Component resolve(MarkupContainer container, MarkupStream markupStream, ComponentTag tag) { if (tag instanceof WicketTag) { final WicketTag wTag = (WicketTag)tag; // If <wicket:property ...> if (PROPERTY.equalsIgnoreCase(wTag.getName())) { wTag.setAutoComponentTag(false); String oClassName = tag.getAttribute("class"); String objectExpression = tag.getAttribute("object"); IModel<?> model = container.getPage().getDefaultModel(); if(!Strings.isEmpty(objectExpression)) model = new ODocumentPropertyModel<ODocument>(model, objectExpression); String property = tag.getAttribute("property"); if(Strings.isEmpty(property)) property = wTag.getId(); if(Strings.isEmpty(oClassName)) { Object object = model.getObject(); if(object instanceof OIdentifiable) { ODocument doc = ((OIdentifiable)object).getRecord(); oClassName = doc.getSchemaClass().getName(); } } IModel<OProperty> propertyModel = new OPropertyModel(oClassName, wTag.getId()); if(propertyModel.getObject()==null) throw new WicketRuntimeException("No such property '"+wTag.getId()+"' defined on class '"+oClassName+"'"); else return new ODocumentMetaPanel<Object>(wTag.getId(), DisplayMode.VIEW.asModel(), (IModel<ODocument>)model, propertyModel); } } // We were not able to handle the tag return null; } }