use of org.mule.runtime.extension.api.loader.Problem in project mule by mulesoft.
the class SourceCallbacksModelValidatorTestCase method assertProblemContaining.
private void assertProblemContaining(String substring) {
List<Problem> errors = problemsReporter.getErrors();
assertThat(errors, is(not(empty())));
Problem problem = errors.get(0);
assertThat(problem.getComponent(), is(sourceModel));
assertThat(problem.getMessage(), is(containsString(substring)));
}
use of org.mule.runtime.extension.api.loader.Problem in project mule by mulesoft.
the class ExportedPackagesValidatorTestCase method invalidExportedPackages.
@Test
public void invalidExportedPackages() {
setUpInvalidExtension();
ExportedPackagesValidator exportedPackagesValidator = new ExportedPackagesValidator();
ProblemsReporter problemsReporter = new ProblemsReporter(extensionModel);
exportedPackagesValidator.validate(extensionModel, problemsReporter);
List<Problem> errors = problemsReporter.getErrors();
assertThat(errors, is(not(IsEmptyCollection.empty())));
Problem error = errors.get(0);
assertThat(error.getComponent(), is(extensionModel));
assertThat(error.getMessage(), containsString("org.mule.test.module.extension.internal"));
List<Problem> warnings = problemsReporter.getWarnings();
assertThat(warnings, is(not(IsEmptyCollection.empty())));
Problem warning = warnings.get(0);
assertThat(warning.getComponent(), is(extensionModel));
assertThat(warning.getMessage(), containsString("org.mule.test.metadata.extension.model.shapes"));
}
use of org.mule.runtime.extension.api.loader.Problem in project mule by mulesoft.
the class ConfigurationModelValidator method validateInjectedConfigType.
private void validateInjectedConfigType(HasOperationModels owner, OperationModel operationModel, ProblemsReporter problemsReporter) {
if (owner instanceof ConfigurationModel) {
Class<?> configType = getConfigurationFactory((ConfigurationModel) owner).getObjectType();
Optional<Class<?>> operationConfigParameterType = operationModel.getModelProperty(ConfigTypeModelProperty.class).map(modelProperty -> modelProperty.getConfigType());
if (operationConfigParameterType.isPresent() && !operationConfigParameterType.get().isAssignableFrom(configType)) {
problemsReporter.addError(new Problem(operationModel, format("Operation '%s' requires a configuration of type '%s'. However, the operation is " + "reachable from configuration '%s' of incompatible type '%s'.", operationModel.getName(), operationConfigParameterType.get().getName(), ((ConfigurationModel) owner).getName(), configType.getName())));
}
}
}
use of org.mule.runtime.extension.api.loader.Problem in project mule by mulesoft.
the class InputParametersTypeModelValidator method validateType.
private void validateType(String message, NamedObject namedObject, MetadataType type, ProblemsReporter problems, Set<Class<?>> validatedTypes) {
ReflectionCache reflectionCache = new ReflectionCache();
getClassForValidation(type).ifPresent(parameterType -> type.accept(new MetadataTypeVisitor() {
@Override
public void visitObject(ObjectType objectType) {
if (validatedTypes.add(parameterType)) {
Collection<ObjectFieldType> parameters = objectType.getFields();
Set<String> fieldsWithGetters = getFieldsWithGetters(parameterType, reflectionCache).stream().map(TypeUtils::getAlias).map(String::toLowerCase).collect(toSet());
Set<String> parameterWithoutGetters = parameters.stream().filter(p -> {
StereotypeTypeAnnotation stereotypes = p.getAnnotation(StereotypeTypeAnnotation.class).orElse(null);
return stereotypes != null ? stereotypes.getAllowedStereotypes().isEmpty() : true;
}).map(f -> f.getKey().getName().getLocalPart()).filter(fieldName -> !fieldsWithGetters.contains(fieldName.toLowerCase())).collect(toSet());
if (!parameterWithoutGetters.isEmpty()) {
problems.addError(new Problem(namedObject, format("%s of type '%s' which contains fields (%s) that doesn't have the corresponding getter methods or getter methods that doesn't correspond to any of the present fields", message, parameterType.getName(), parameterWithoutGetters.stream().collect(joining(", ")))));
}
}
}
@Override
public void visitArrayType(ArrayType arrayType) {
validateType(message, namedObject, arrayType.getType(), problems, validatedTypes);
}
}));
}
use of org.mule.runtime.extension.api.loader.Problem 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);
}
Aggregations