use of org.apache.tapestry5.ioc.annotations.Order in project tapestry-5 by apache.
the class BeanModelSourceImpl method create.
public <T> BeanModel<T> create(Class<T> beanClass, boolean filterReadOnlyProperties, Messages messages) {
assert beanClass != null;
assert messages != null;
ClassPropertyAdapter adapter = propertyAccess.getAdapter(beanClass);
BeanModel<T> model = new BeanModelImpl<T>(beanClass, propertyConduitSource, typeCoercer, messages, locator);
for (final String propertyName : adapter.getPropertyNames()) {
PropertyAdapter pa = adapter.getPropertyAdapter(propertyName);
if (!pa.isRead()) {
continue;
}
if (isStaticFieldProperty(pa)) {
continue;
}
if (pa.getAnnotation(NonVisual.class) != null) {
continue;
}
if (filterReadOnlyProperties && !pa.isUpdate()) {
continue;
}
final String dataType = dataTypeAnalyzer.identifyDataType(pa);
if (dataType == null) {
continue;
}
model.add(propertyName).dataType(dataType);
}
// First, order the properties based on the location of the getter method
// within the class.
List<String> propertyNames = model.getPropertyNames();
orderProperties(adapter, propertyNames);
model.reorder(propertyNames.toArray(new String[propertyNames.size()]));
// Next, check for an annotation with specific ordering information.
ReorderProperties reorderAnnotation = beanClass.getAnnotation(ReorderProperties.class);
if (reorderAnnotation != null) {
BeanModelUtils.reorder(model, reorderAnnotation.value());
}
return model;
}
use of org.apache.tapestry5.ioc.annotations.Order in project tapestry-5 by apache.
the class MessagesSourceImpl method findBundleProperties.
/**
* Assembles a set of properties appropriate for the bundle in question, and the desired locale. The properties
* reflect the properties of the bundles' parent (if any) for the locale, overalyed with any properties defined for
* this bundle and its locale.
*/
private Map<String, String> findBundleProperties(MessagesBundle bundle, ComponentResourceSelector selector) {
if (bundle == null)
return emptyMap;
MultiKey key = new MultiKey(bundle.getId(), selector);
Map<String, String> existing = cookedProperties.get(key);
if (existing != null)
return existing;
// What would be cool is if we could maintain a cache of bundle id + locale -->
// Resource. That would optimize quite a bit of this; may need to use an alternative to
// LocalizedNameGenerator.
Resource propertiesResource = bundle.getBaseResource().withExtension("properties");
List<Resource> localizations = resourceLocator.locateMessageCatalog(propertiesResource, selector);
// Localizations are now in least-specific to most-specific order.
Map<String, String> previous = findBundleProperties(bundle.getParent(), selector);
for (Resource localization : F.flow(localizations).reverse()) {
Map<String, String> rawProperties = getRawProperties(localization);
// Woould be nice to write into the cookedProperties cache here,
// but we can't because we don't know the selector part of the MultiKey.
previous = extend(previous, rawProperties);
}
cookedProperties.put(key, previous);
return previous;
}
use of org.apache.tapestry5.ioc.annotations.Order in project tapestry-5 by apache.
the class LinkSourceImplTest method create_page_render_link_by_name.
@Test
public void create_page_render_link_by_name() {
String pageName = "order/Edit";
PageActivationContextCollector collector = mockPageActivationContextCollector();
ComponentEventLinkEncoder linkEncoder = mockComponentEventLinkEncoder();
Link link = mockLink();
ComponentClassResolver resolver = mockComponentClassResolver();
RequestGlobals globals = mockRequestGlobals();
expect(globals.getActivePageName()).andReturn("someOtherPage");
train_canonicalizePageName(resolver, pageName, pageName);
train_collectPageActivationContext(collector, pageName, 3);
EventContext pageActivationContext = new ArrayEventContext(typeCoercer, 3);
PageRenderRequestParameters parameters = new PageRenderRequestParameters(pageName, pageActivationContext, false);
expect(linkEncoder.createPageRenderLink(parameters)).andReturn(link);
replay();
LinkSource source = new LinkSourceImpl(null, collector, typeCoercer, resolver, linkEncoder, globals, null, emptyConfiguration);
Link actual = source.createPageRenderLink(pageName, false);
// Make sure the same link is returned.
assertEquals(actual, link);
verify();
}
use of org.apache.tapestry5.ioc.annotations.Order in project tapestry-5 by apache.
the class LinkSourceImplTest method component_event_from_other_page.
@Test
public void component_event_from_other_page() {
String primaryPageName = "blocks/AppDisplay";
Page primaryPage = mockPage();
Page activePage = mockPage();
PageRenderQueue queue = mockPageRenderQueue();
PageActivationContextCollector collector = mockPageActivationContextCollector();
ComponentEventLinkEncoder linkEncoder = mockComponentEventLinkEncoder();
Link link = mockLink();
train_getRenderingPage(queue, activePage);
train_getName(activePage, "order/View");
train_getName(primaryPage, primaryPageName);
train_collectPageActivationContext(collector, "order/View", "x", "y");
EventContext pageActivationContext = new ArrayEventContext(typeCoercer, "x", "y");
EventContext eventContext = new ArrayEventContext(typeCoercer, 3, 5, 9);
ComponentEventRequestParameters parameters = new ComponentEventRequestParameters("order/View", primaryPageName, "gnip.gnop", "myevent", pageActivationContext, eventContext);
expect(linkEncoder.createComponentEventLink(parameters, true)).andReturn(link);
replay();
LinkSource source = new LinkSourceImpl(queue, collector, typeCoercer, null, linkEncoder, null, null, emptyConfiguration);
assertSame(source.createComponentEventLink(primaryPage, "gnip.gnop", "myevent", true, 3, 5, 9), link);
verify();
}
use of org.apache.tapestry5.ioc.annotations.Order in project tapestry-5 by apache.
the class AbstractBeanModelSourceImplTest method default_model_for_bean.
/**
* Tests defaults for property names, labels and conduits.
*/
@Test
public void default_model_for_bean() {
Messages messages = mockMessages();
stub_contains(messages, false);
replay();
BeanModel model = source.create(SimpleBean.class, true, messages);
assertSame(model.getBeanType(), SimpleBean.class);
// Based on order of the getter methods (no longer alphabetical)
assertEquals(model.getPropertyNames(), Arrays.asList("firstName", "lastName", "age"));
assertEquals(model.toString(), "BeanModel[org.apache.tapestry5.genericsresolverguava.internal.SimpleBean properties:firstName, lastName, age]");
PropertyModel age = model.get("age");
assertEquals(age.getLabel(), "Age");
assertSame(age.getPropertyType(), int.class);
assertEquals(age.getDataType(), "number");
PropertyModel firstName = model.get("firstName");
assertEquals(firstName.getLabel(), "First Name");
assertEquals(firstName.getPropertyType(), String.class);
assertEquals(firstName.getDataType(), "text");
assertEquals(model.get("lastName").getLabel(), "Last Name");
PropertyConduit conduit = model.get("lastName").getConduit();
SimpleBean instance = new SimpleBean();
instance.setLastName("Lewis Ship");
assertEquals(conduit.get(instance), "Lewis Ship");
conduit.set(instance, "TapestryDude");
assertEquals(instance.getLastName(), "TapestryDude");
// Now, one with some type coercion.
age.getConduit().set(instance, "40");
assertEquals(instance.getAge(), 40);
verify();
}
Aggregations