use of org.apache.tapestry5.commons.AnnotationProvider in project tapestry-5 by apache.
the class AssetObjectProviderTest method no_path_annotation.
@Test
public void no_path_annotation() {
AssetSource source = mockAssetSource();
ObjectLocator locator = mockObjectLocator();
AnnotationProvider annotationProvider = mockAnnotationProvider();
TypeCoercer typeCoercer = mockTypeCoercer();
SymbolSource symbolSource = mockSymbolSource();
train_getAnnotation(annotationProvider, Path.class, null);
replay();
ObjectProvider provider = new AssetObjectProvider(source, typeCoercer, symbolSource);
assertNull(provider.provide(Asset.class, annotationProvider, locator));
verify();
}
use of org.apache.tapestry5.commons.AnnotationProvider in project tapestry-5 by apache.
the class AssetObjectProviderTest method normal_conversion.
@Test
public void normal_conversion() {
AssetSource source = mockAssetSource();
ObjectLocator locator = mockObjectLocator();
Asset asset = mockAsset();
String path = "${foo}";
String expanded = "foo/bar/baz.gif";
AnnotationProvider annotationProvider = mockAnnotationProvider();
TypeCoercer typeCoercer = mockTypeCoercer();
Path pathAnnotation = mockPath();
SymbolSource symbolSource = mockSymbolSource();
train_getAnnotation(annotationProvider, Path.class, pathAnnotation);
train_value(pathAnnotation, path);
train_expandSymbols(symbolSource, path, expanded);
train_getAsset(source, null, expanded, null, asset);
train_coerce(typeCoercer, asset, Asset.class, asset);
replay();
ObjectProvider provider = new AssetObjectProvider(source, typeCoercer, symbolSource);
Asset result = provider.provide(Asset.class, annotationProvider, locator);
assertSame(result, asset);
verify();
}
use of org.apache.tapestry5.commons.AnnotationProvider in project tapestry-5 by apache.
the class CDIInjectionProvider method provideInjection.
/* (non-Javadoc)
* @see org.apache.tapestry5.services.transform.InjectionProvider2#provideInjection(org.apache.tapestry5.plastic.PlasticField, org.apache.tapestry5.ioc.ObjectLocator, org.apache.tapestry5.model.MutableComponentModel)
*/
@SuppressWarnings("rawtypes")
public boolean provideInjection(final PlasticField field, final ObjectLocator locator, final MutableComponentModel componentModel) {
Class type = cache.forName(field.getTypeName());
if (InternalUtils.isManagedByTapestry(type, new AnnotationProvider() {
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
return field.getAnnotation(annotationClass);
}
}, locator)) {
logger.debug("Field " + field.getName() + " of type " + field.getTypeName() + " is managed by Tapestry");
return false;
}
logger.debug("Field " + field.getName() + " of type " + field.getTypeName() + " will be managed by CDI");
final Class<?> fieldClass = load(field.getTypeName());
final Annotation[] qualifiers = InternalUtils.getFieldQualifiers(type, new AnnotationProvider() {
public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
return field.getAnnotation(annotationClass);
}
});
logger.debug("[" + field.getName() + "][" + componentModel.getComponentClassName() + "] Qualifiers : ");
for (Annotation annotation : qualifiers) {
logger.debug("==> " + annotation.toString());
}
try {
final BeanInstance instance = getInstance(fieldClass, qualifiers);
final boolean resolved = instance != null && instance.isResolved();
if (resolved) {
field.inject(instance.getBean());
}
if (instance != null && instance.isReleasable()) {
synchronized (instancesToRelease) {
instancesToRelease.add(instance);
}
}
logger.debug("Is field " + field.getName() + " of type " + field.getTypeName() + " has been succesfully managed by CDI ? " + resolved);
return resolved;
} catch (IllegalStateException isa) {
logger.debug("CDI failed to manage the field " + field.getName() + " of type " + field.getTypeName());
return false;
}
}
use of org.apache.tapestry5.commons.AnnotationProvider in project tapestry-5 by apache.
the class TapestryModule method decorateFieldValidatorDefaultSource.
/**
* Decorate FieldValidatorDefaultSource to setup the EnvironmentMessages
* object and place it in the environment.
* Although this could have been implemented directly in the default
* implementation of the service, doing it
* as service decoration ensures that the environment will be properly setup
* even if a user overrides the default
* service implementation.
*
* @param defaultSource
* The service to decorate
* @param environment
*/
public static FieldValidatorDefaultSource decorateFieldValidatorDefaultSource(final FieldValidatorDefaultSource defaultSource, final Environment environment) {
return new FieldValidatorDefaultSource() {
public FieldValidator createDefaultValidator(Field field, String overrideId, Messages overrideMessages, Locale locale, Class propertyType, AnnotationProvider propertyAnnotations) {
environment.push(EnvironmentMessages.class, new EnvironmentMessages(overrideMessages, overrideId));
FieldValidator fieldValidator = defaultSource.createDefaultValidator(field, overrideId, overrideMessages, locale, propertyType, propertyAnnotations);
environment.pop(EnvironmentMessages.class);
return fieldValidator;
}
public FieldValidator createDefaultValidator(ComponentResources resources, String parameterName) {
EnvironmentMessages em = new EnvironmentMessages(resources.getContainerMessages(), resources.getId());
environment.push(EnvironmentMessages.class, em);
FieldValidator fieldValidator = defaultSource.createDefaultValidator(resources, parameterName);
environment.pop(EnvironmentMessages.class);
return fieldValidator;
}
};
}
use of org.apache.tapestry5.commons.AnnotationProvider in project tapestry-5 by apache.
the class SpringModuleDef method createContributionToMasterObjectProvider.
private ContributionDef createContributionToMasterObjectProvider() {
ContributionDef def = new AbstractContributionDef() {
@Override
public String getServiceId() {
return "MasterObjectProvider";
}
@Override
public void contribute(ModuleBuilderSource moduleSource, ServiceResources resources, OrderedConfiguration configuration) {
final OperationTracker tracker = resources.getTracker();
final ApplicationContext context = resources.getService(SERVICE_ID, ApplicationContext.class);
final ObjectProvider springBeanProvider = new ObjectProvider() {
@Override
public <T> T provide(Class<T> objectType, AnnotationProvider annotationProvider, ObjectLocator locator) {
Map beanMap = context.getBeansOfType(objectType);
switch(beanMap.size()) {
case 0:
return null;
case 1:
Object bean = beanMap.values().iterator().next();
return objectType.cast(bean);
default:
String message = String.format("Spring context contains %d beans assignable to type %s: %s.", beanMap.size(), PlasticUtils.toTypeName(objectType), InternalUtils.joinSorted(beanMap.keySet()));
throw new IllegalArgumentException(message);
}
}
};
final ObjectProvider springBeanProviderInvoker = new ObjectProvider() {
@Override
public <T> T provide(final Class<T> objectType, final AnnotationProvider annotationProvider, final ObjectLocator locator) {
return tracker.invoke("Resolving dependency by searching Spring ApplicationContext", new Invokable<T>() {
@Override
public T invoke() {
return springBeanProvider.provide(objectType, annotationProvider, locator);
}
});
}
};
ObjectProvider outerCheck = new ObjectProvider() {
@Override
public <T> T provide(Class<T> objectType, AnnotationProvider annotationProvider, ObjectLocator locator) {
if (!applicationContextCreated.get())
return null;
return springBeanProviderInvoker.provide(objectType, annotationProvider, locator);
}
};
configuration.add("SpringBean", outerCheck, "after:AnnotationBasedContributions", "after:ServiceOverride");
}
};
return def;
}
Aggregations