content: /*
   * CSVeed (https://github.com/42BV/CSVeed)
   *
   * Copyright 2013-2023 CSVeed.
   *
   * All rights reserved. This program and the accompanying materials
   * are made available under the terms of The Apache Software License,
   * Version 2.0 which accompanies this distribution, and is available at
   * https://www.apache.org/licenses/LICENSE-2.0.txt
   */
  package org.csveed.bean.conversion;
  
  import java.lang.reflect.Method;
  
  import org.csveed.bean.BeanProperty;
  
  /**
   * The Class BeanWrapper.
   */
  public class BeanWrapper {
  
      /** The default converters. */
      private DefaultConverters defaultConverters;
  
      /** The bean. */
      private Object bean;
  
      /**
       * Instantiates a new bean wrapper.
       *
       * @param defaultConverters
       *            the default converters
       * @param bean
       *            the bean
       */
      public BeanWrapper(DefaultConverters defaultConverters, Object bean) {
          this.defaultConverters = defaultConverters;
          this.bean = bean;
      }
  
      /**
       * Gets the property.
       *
       * @param property
       *            the property
       *
       * @return the property
       *
       * @throws ConversionException
       *             the conversion exception
       */
      public String getProperty(BeanProperty property) throws ConversionException {
          Method readMethod = property.getPropertyDescriptor().getReadMethod();
          Converter converter = getConverter(property);
          if (converter == null) {
              throw new NoConverterFoundException("No Converter found for", getPropertyType(property));
          }
          try {
              Object value = readMethod.invoke(bean);
              return converter.toString(value);
          } catch (Exception err) {
              throw new BeanPropertyConversionException("Problem converting", converter.infoOnType(), err);
          }
      }
  
      /**
       * Sets the property.
       *
       * @param property
       *            the property
       * @param value
       *            the value
       *
       * @throws ConversionException
       *             the conversion exception
       */
      public void setProperty(BeanProperty property, String value) throws ConversionException {
          Method writeMethod = property.getPropertyDescriptor().getWriteMethod();
          Converter converter = getConverter(property);
          if (converter == null) {
              throw new NoConverterFoundException("No Converter found for", getPropertyType(property));
          }
          try {
              writeMethod.invoke(bean, value == null || value.equals("") ? null : converter.fromString(value));
          } catch (Exception err) {
              throw new BeanPropertyConversionException("Problem converting", converter.infoOnType(), err);
          }
      }
  
      /**
       * Gets the converter.
       *
       * @param property
       *            the property
       *
       * @return the converter
       */
      protected Converter getConverter(BeanProperty property) {
          if (property.getConverter() != null) {
              return property.getConverter();
          }
          return defaultConverters.getConverter(getPropertyType(property));
      }
  
      /**
       * Gets the property type.
       *
       * @param property
       *            the property
       *
       * @return the property type
       */
      protected Class getPropertyType(BeanProperty property) {
          return property.getPropertyDescriptor().getPropertyType();
      }
  
  }
  