/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.config.spring.dsl.spring; import static org.mule.runtime.dsl.api.component.DslSimpleType.isSimpleType; import static org.mule.runtime.api.util.Preconditions.checkState; import org.mule.runtime.dsl.api.component.TypeConverter; import org.mule.runtime.config.spring.dsl.model.ComponentModel; import org.mule.runtime.config.spring.dsl.processor.ObjectTypeVisitor; import java.util.Map; import java.util.Optional; /** * Bean definition creator for elements that end up representing simple types. * <p> * <p> * Elements that represent a simple type always have the form * * <pre> * <element value="simpleValue"/> * </pre> * * @since 4.0 */ public class SimpleTypeBeanDefinitionCreator extends BeanDefinitionCreator { @Override boolean handleRequest(CreateBeanDefinitionRequest createBeanDefinitionRequest) { ObjectTypeVisitor objectTypeVisitor = new ObjectTypeVisitor(createBeanDefinitionRequest.getComponentModel()); createBeanDefinitionRequest.getComponentBuildingDefinition().getTypeDefinition().visit(objectTypeVisitor); Class<?> type = objectTypeVisitor.getType(); if (isSimpleType(type)) { ComponentModel componentModel = createBeanDefinitionRequest.getComponentModel(); componentModel.setType(type); Map<String, String> parameters = componentModel.getParameters(); checkState(parameters.size() < 2, "Component model has more than one parameter when it's supposed to have at most one parameter"); checkState(componentModel.getTextContent() != null || !componentModel.getParameters().isEmpty(), "Component model has both a parameter and an inner content"); final String value = componentModel.getTextContent() != null ? componentModel.getTextContent() : parameters.values().iterator().next(); Optional<TypeConverter> typeConverterOptional = createBeanDefinitionRequest.getComponentBuildingDefinition().getTypeConverter(); componentModel.setBeanDefinition(getConvertibleBeanDefinition(type, value, typeConverterOptional)); return true; } return false; } }