package org.sql2o.reflection; import org.sql2o.Sql2oException; import org.sql2o.converters.Converter; import org.sql2o.converters.ConverterException; import org.sql2o.quirks.Quirks; import static org.sql2o.converters.Convert.throwIfNull; /** * Used internally to represent a plain old java object. */ public class Pojo { private PojoMetadata metadata; private boolean caseSensitive; private Object object; public Pojo(PojoMetadata metadata, boolean caseSensitive, Object object){ this.caseSensitive = caseSensitive; this.metadata = metadata; this.object = object; } public Pojo(PojoMetadata metadata, boolean caseSensitive){ this.caseSensitive = caseSensitive; this.metadata = metadata; ObjectConstructor objectConstructor = metadata.getObjectConstructor(); object = objectConstructor.newInstance(); } @SuppressWarnings("unchecked") public Object getProperty(String propertyPath, Quirks quirks){ // String.split uses RegularExpression // this is overkill for every column for every row int index = propertyPath.indexOf('.'); Getter getter; if (index > 0) { final String substring = propertyPath.substring(0, index); getter = metadata.getPropertyGetter(substring); String newPath = propertyPath.substring(index+1); Object subValue = this.metadata.getValueOfProperty(substring, this.object); if (subValue == null){ try { subValue = getter.getType().newInstance(); } catch (InstantiationException e) { throw new Sql2oException("Could not instantiate a new instance of class "+ getter.getType().toString(), e); } catch (IllegalAccessException e) { throw new Sql2oException("Could not instantiate a new instance of class "+ getter.getType().toString(), e); } return getter.getProperty(this.object); } PojoMetadata subMetadata = new PojoMetadata(getter.getType(), this.caseSensitive, this.metadata.isAutoDeriveColumnNames(), this.metadata.getColumnMappings(), this.metadata.throwOnMappingFailure); Pojo subPojo = new Pojo(subMetadata, this.caseSensitive, subValue); return subPojo.getProperty(newPath, quirks); } else{ getter = metadata.getPropertyGetter(propertyPath); Converter converter; try { converter = throwIfNull(getter.getType(), quirks.converterOf(getter.getType())); } catch (ConverterException e) { throw new Sql2oException("Cannot convert column " + propertyPath + " to type " + getter.getType(), e); } try { return converter.convert(getter.getProperty(this.object)); } catch (ConverterException e) { throw new Sql2oException("Error trying to convert column " + propertyPath + " to type " + getter.getType(), e); } } } @SuppressWarnings("unchecked") public void setProperty(String propertyPath, Object value, Quirks quirks){ // String.split uses RegularExpression // this is overkill for every column for every row int index = propertyPath.indexOf('.'); Setter setter; if (index > 0){ final String substring = propertyPath.substring(0, index); setter = metadata.getPropertySetter(substring); String newPath = propertyPath.substring(index+1); Object subValue = this.metadata.getValueOfProperty(substring, this.object); if (subValue == null){ try { subValue = setter.getType().newInstance(); } catch (InstantiationException e) { throw new Sql2oException("Could not instantiate a new instance of class "+ setter.getType().toString(), e); } catch (IllegalAccessException e) { throw new Sql2oException("Could not instantiate a new instance of class "+ setter.getType().toString(), e); } setter.setProperty(this.object, subValue); } PojoMetadata subMetadata = new PojoMetadata(setter.getType(), this.caseSensitive, this.metadata.isAutoDeriveColumnNames(), this.metadata.getColumnMappings(), this.metadata.throwOnMappingFailure); Pojo subPojo = new Pojo(subMetadata, this.caseSensitive, subValue); subPojo.setProperty(newPath, value, quirks); } else{ setter = metadata.getPropertySetter(propertyPath); Converter converter; try { converter = throwIfNull(setter.getType(), quirks.converterOf(setter.getType())); } catch (ConverterException e) { throw new Sql2oException("Cannot convert column " + propertyPath + " to type " + setter.getType(), e); } try { setter.setProperty(this.object, converter.convert( value )); } catch (ConverterException e) { throw new Sql2oException("Error trying to convert column " + propertyPath + " to type " + setter.getType(), e); } } } public Object getObject(){ return this.object; } }