@SuppressWarnings("unchecked") private <S, D> void propertyMap(Mapping mapping, MappingContextImpl<S, D> context) { MappingImpl mappingImpl = (MappingImpl) mapping; if (context.isShaded(mappingImpl.getPath())) return; Condition<Object, Object> condition = (Condition<Object, Object>) mapping.getCondition(); if (condition == null) condition = (Condition<Object, Object>) context.getTypeMap().getPropertyCondition(); if (condition == null && mapping.isSkipped()) return; Object source = resolveSourceValue(context, mapping); MappingContextImpl<Object, Object> propertyContext = propertyContextFor(context, source, mapping); if (condition != null) { if (!condition.applies(propertyContext)) { context.shadePath(mappingImpl.getPath()); return; } else if (mapping.isSkipped()) return; } Converter<Object, Object> converter = (Converter<Object, Object>) mapping.getConverter(); if (converter == null) converter = (Converter<Object, Object>) context.getTypeMap().getPropertyConverter(); if (converter != null) context.shadePath(mappingImpl.getPath()); else if (mapping instanceof SourceMapping) return; // Create destination for property context prior to mapping/conversion createDestinationViaProvider(propertyContext); // Set mapped/converted destination value setDestinationValue(context, propertyContext, mappingImpl, converter); }
/** Returns a property context. */ @SuppressWarnings({"rawtypes", "unchecked"}) private MappingContextImpl<Object, Object> propertyContextFor( MappingContextImpl<?, ?> context, Object source, Mapping mapping) { Class<?> sourceType; boolean cyclic = false; if (mapping instanceof PropertyMapping) { PropertyMappingImpl propertyMapping = (PropertyMappingImpl) mapping; sourceType = propertyMapping.getLastSourceProperty().getType(); cyclic = propertyMapping.cyclic; } else if (mapping instanceof ConstantMapping) { Object constant = ((ConstantMapping) mapping).getConstant(); sourceType = constant == null ? Object.class : Types.deProxy(constant.getClass()); } else { sourceType = ((SourceMapping) mapping).getSourceType(); } Class<Object> destinationType = (Class<Object>) mapping.getLastDestinationProperty().getType(); return new MappingContextImpl( context, source, sourceType, null, destinationType, null, mapping, !cyclic); }