use of org.mule.runtime.module.extension.internal.util.ReflectionCache in project mule by mulesoft.
the class NullSafeModelValidator method validate.
@Override
public void validate(ExtensionModel extensionModel, ProblemsReporter problemsReporter) {
ReflectionCache reflectionCache = new ReflectionCache();
TypeLoader typeLoader = ExtensionsTypeLoaderFactory.getDefault().createTypeLoader();
new ExtensionWalker() {
@Override
public void onParameter(ParameterizedModel owner, ParameterGroupModel groupModel, ParameterModel model) {
model.getType().accept(new MetadataTypeVisitor() {
@Override
public void visitObject(ObjectType objectType) {
if (objectType.getMetadataFormat().equals(JAVA) && !isMap(objectType)) {
objectType.getAnnotation(TypeIdAnnotation.class).map(TypeIdAnnotation::getValue).ifPresent(typeId -> typeLoader.load(typeId).ifPresent(fieldMetadataType -> objectType.getFields().stream().filter(f -> f.getAnnotation(NullSafeTypeAnnotation.class).isPresent()).forEach(f -> validateField(getLocalPart(f), f, getType(fieldMetadataType), f.getAnnotation(NullSafeTypeAnnotation.class).get()))));
}
}
private void validateField(String fieldName, ObjectFieldType field, Class<?> declaringClass, NullSafeTypeAnnotation nullSafeTypeAnnotation) {
Class<?> nullSafeType = nullSafeTypeAnnotation.getType();
Class<?> fieldType = getType(field.getValue());
boolean hasDefaultOverride = nullSafeTypeAnnotation.hasDefaultOverride();
field.getValue().accept(new BasicTypeMetadataVisitor() {
@Override
protected void visitBasicType(MetadataType metadataType) {
problemsReporter.addError(new Problem(extensionModel, format("Field '%s' in class '%s' is annotated with '@%s' but is of type '%s'. That annotation can only be " + "used with complex types (Pojos, Lists, Maps)", fieldName, declaringClass.getName(), NullSafe.class.getSimpleName(), fieldType.getName())));
}
@Override
public void visitArrayType(ArrayType arrayType) {
if (hasDefaultOverride) {
problemsReporter.addError(new Problem(extensionModel, format("Field '%s' in class '%s' is annotated with '@%s' is of type '%s'" + " but a 'defaultImplementingType' was provided." + " Type override is not allowed for Collections", fieldName, declaringClass.getName(), NullSafe.class.getSimpleName(), fieldType.getName())));
}
}
@Override
public void visitObject(ObjectType objectType) {
String requiredFields = objectType.getFields().stream().filter(f -> f.isRequired() && !isFlattenedParameterGroup(f)).map(MetadataTypeUtils::getLocalPart).collect(joining(", "));
if (!isBlank(requiredFields) && isCompiletime(extensionModel)) {
problemsReporter.addError(new Problem(model, format("Class '%s' cannot be used with '@%s' parameter since it contains non optional fields: [%s]", getId(objectType).orElse(""), NullSafe.class.getSimpleName(), requiredFields)));
}
if (objectType.isOpen()) {
if (hasDefaultOverride) {
problemsReporter.addError(new Problem(model, format("Field '%s' in class '%s' is annotated with '@%s' is of type '%s'" + " but a 'defaultImplementingType' was provided." + " Type override is not allowed for Maps", fieldName, declaringClass.getName(), NullSafe.class.getSimpleName(), fieldType.getName())));
}
return;
}
if (hasDefaultOverride && isInstantiable(fieldType, reflectionCache)) {
problemsReporter.addError(new Problem(model, format("Field '%s' in class '%s' is annotated with '@%s' is of concrete type '%s'," + " but a 'defaultImplementingType' was provided." + " Type override is not allowed for concrete types", fieldName, declaringClass.getName(), NullSafe.class.getSimpleName(), fieldType.getName())));
}
if (!isInstantiable(nullSafeType, reflectionCache)) {
problemsReporter.addError(new Problem(model, format("Field '%s' in class '%s' is annotated with '@%s' but is of type '%s'. That annotation can only be " + "used with complex instantiable types (Pojos, Lists, Maps)", fieldName, declaringClass.getName(), NullSafe.class.getSimpleName(), nullSafeType.getName())));
}
if (hasDefaultOverride && !fieldType.isAssignableFrom(nullSafeType)) {
problemsReporter.addError(new Problem(model, format("Field '%s' in class '%s' is annotated with '@%s' of type '%s', but provided type '%s" + " is not a subtype of the parameter's type", fieldName, declaringClass.getName(), NullSafe.class.getSimpleName(), fieldType.getName(), nullSafeType.getName())));
}
}
});
}
});
}
}.walk(extensionModel);
}
use of org.mule.runtime.module.extension.internal.util.ReflectionCache in project mule by mulesoft.
the class DynamicConfigurationProviderTestCase method before.
@Override
@Before
public void before() throws Exception {
mockConfigurationInstance(configurationModel, MODULE_CLASS.newInstance());
mockInterceptors(configurationModel, null);
when(configurationModel.getOperationModels()).thenReturn(asList(operationModel));
when(configurationModel.getSourceModels()).thenReturn(ImmutableList.of());
mockClassLoaderModelProperty(extensionModel, getClass().getClassLoader());
when(extensionModel.getSourceModels()).thenReturn(ImmutableList.of());
when(extensionModel.getOperationModels()).thenReturn(asList(operationModel));
when(extensionModel.getConfigurationModels()).thenReturn(asList(configurationModel));
when(operationModel.requiresConnection()).thenReturn(true);
when(configurationModel.getOperationModels()).thenReturn(asList(operationModel));
when(configurationModel.getSourceModels()).thenReturn(ImmutableList.of());
when(resolverSet.resolve(from(event))).thenReturn(resolverSetResult);
when(resolverSetResult.asMap()).thenReturn(new HashMap<>());
visitableMock(operationModel);
expirationPolicy = new ImmutableExpirationPolicy(5, MINUTES, timeSupplier);
when(connectionProviderResolver.getResolverSet()).thenReturn(empty());
when(connectionProviderResolver.resolve(any())).thenReturn(null);
provider = new DynamicConfigurationProvider(CONFIG_NAME, extensionModel, configurationModel, resolverSet, connectionProviderResolver, expirationPolicy, new ReflectionCache(), muleContext);
super.before();
provider.initialise();
provider.start();
}
use of org.mule.runtime.module.extension.internal.util.ReflectionCache in project mule by mulesoft.
the class ValueProviderModelValidator method validateModel.
private void validateModel(ParameterizedModel model, ProblemsReporter problemsReporter, boolean supportsConnectionsAndConfigs) {
ReflectionCache reflectionCache = new ReflectionCache();
model.getAllParameterModels().forEach(param -> param.getModelProperty(ValueProviderFactoryModelProperty.class).ifPresent(modelProperty -> validateOptionsResolver(param, modelProperty, model, problemsReporter, supportsConnectionsAndConfigs, reflectionCache)));
}
Aggregations