/** * Cache the specified MetaBean. * @param beanInfo */ public void cache(MetaBean beanInfo) { cacheById.put(beanInfo.getId(), beanInfo); if (beanInfo.getBeanClass() != null && beanInfo.getId().equals(beanInfo.getBeanClass().getName())) { cacheByClass.putIfAbsent(beanInfo.getBeanClass(), beanInfo); } }
/** * Remove a single MetaBean from the cache. * @param beanInfo */ public void removeFromCache(MetaBean beanInfo) { cacheById.remove(beanInfo.getId()); if (beanInfo.getBeanClass() != null && beanInfo.getId().equals(beanInfo.getBeanClass().getName())) { cacheByClass.remove(beanInfo.getBeanClass()); } }
@Override public void buildMetaBean(final MetaBean metaBean) throws Exception { if (metaBean.getId() == null) return; visitXMLBeanMeta(metaBean.getId(), new Visitor() { @Override public void visit(XMLMetaBean xmlMeta, XMLMetaBeanInfos xmlInfos) throws Exception { enrichMetaBean(metaBean, new XMLResult(xmlMeta, xmlInfos)); } @Override public MetaBean getMetaBean() { return metaBean; } }); }
Map<String, MetaBean> allBuilt = builder.buildAll(); for (MetaBean meta : allBuilt.values()) { MetaBean cached = cache.findForId(meta.getId()); if (cached == null) { cache.cache(meta);
/** * If we currently have a property, navigate the context such that the property becomes the bean, in preparation for * another property. * * @param validationContext */ public void moveDownIfNecessary() { MetaProperty mp = validationContext.getMetaProperty(); if (mp != null) { if (mp.getMetaBean() == null) { throw new UnknownPropertyException(String.format("Property %s.%s is not cascaded", mp .getParentMetaBean().getId(), mp.getName())); } validationContext.moveDown(mp, new NullSafePropertyAccess(validationContext.getMetaBean().getBeanClass(), mp.getName())); } }
/** * {@inheritDoc} */ public void handleProperty(String token) { moveDownIfNecessary(); MetaBean metaBean = validationContext.getMetaBean(); if (metaBean instanceof DynamicMetaBean) { metaBean = metaBean.resolveMetaBean(ObjectUtils.defaultIfNull(validationContext.getBean(), rawType)); validationContext.setMetaBean(metaBean); } MetaProperty mp = metaBean.getProperty(token); if (mp == null) { // TODO this could indicate a property hosted on a superclass; should we shunt the context traversal down a path based on that type? PropertyAccess access = new PropertyAccess(rawType, token); if (access.isKnown()) { // add heretofore unknown, but valid, property on the fly: mp = Jsr303MetaBeanFactory.addMetaProperty(metaBean, access); } else { throw new UnknownPropertyException("unknown property '" + token + "' in " + metaBean.getId()); } } validationContext.setMetaProperty(mp); setType(mp.getType()); }