public MapFieldMap(FieldMap fieldMap) { //Create from existing field map super(fieldMap.getClassMap()); setCopyByReference(fieldMap.isCopyByReference()); setCustomConverter(fieldMap.getCustomConverter()); setCustomConverterId(fieldMap.getCustomConverterId()); setCustomConverterParam(fieldMap.getCustomConverterParam()); setDestField(fieldMap.getDestField()); setDestHintContainer(fieldMap.getDestHintContainer()); setDestDeepIndexHintContainer(fieldMap.getDestDeepIndexHintContainer()); setMapId(fieldMap.getMapId()); setRelationshipType(fieldMap.getRelationshipType()); setRemoveOrphans(fieldMap.isRemoveOrphans()); setSrcField(fieldMap.getSrcField()); setSrcHintContainer(fieldMap.getSrcHintContainer()); setSrcDeepIndexHintContainer(fieldMap.getSrcDeepIndexHintContainer()); setType(fieldMap.getType()); }
srcValueType = fieldMapping.getSrcFieldType(); try { if (destObj != null) { destFieldTypeName = fieldMapping.getDestFieldType(destObj.getClass()).getName(); return "Field mapping error -->" + "\n MapId: " + fieldMapping.getMapId() + "\n Type: " + fieldMapping.getType() + "\n Source parent class: " + srcClassName + "\n Source field name: " + fieldMapping.getSrcFieldName() + "\n Source field type: " + srcValueType + "\n Source field value: " + srcFieldValueString + "\n Dest parent class: " + destClassName + "\n Dest field name: " + fieldMapping.getDestFieldName() + "\n Dest field type: " + destFieldTypeName;
public void build() { // TODO Check Map to Map mapping FieldMap result; if (srcField.isMapTypeCustomGetterSetterField() || destField.isMapTypeCustomGetterSetterField() || classMap.isSrcClassMapTypeCustomGetterSetter() || classMap.isDestClassMapTypeCustomGetterSetter()) { result = new MapFieldMap(classMap); } else if (srcField.isCustomGetterSetterField() || destField.isCustomGetterSetterField()) { result = new CustomGetSetMethodFieldMap(classMap); } else { result = new GenericFieldMap(classMap); } result.setSrcField(srcField); result.setDestField(destField); result.setType(type); result.setRelationshipType(relationshipType); result.setRemoveOrphans(removeOrphans); result.setSrcHintContainer(srcHintContainer); result.setDestHintContainer(destHintContainer); result.setSrcDeepIndexHintContainer(srcDeepIndexHintContainer); result.setDestDeepIndexHintContainer(destDeepIndexHintContainer); if (copyByReferenceSet) { result.setCopyByReference(copyByReference); } result.setMapId(mapId); result.setCustomConverter(customConverter); result.setCustomConverterId(customConverterId); result.setCustomConverterParam(customConverterParam); classMap.addFieldMapping(result); }
public static void reverseFields(FieldMap source, FieldMap reversed) { DozerField destField = source.getSrcFieldCopy(); DozerField sourceField = source.getDestFieldCopy(); reversed.setDestField(destField); reversed.setSrcField(sourceField); reversed.setCustomConverter(source.getCustomConverter()); reversed.setCustomConverterId(source.getCustomConverterId()); reversed.setMapId(source.getMapId()); reversed.setRelationshipType(source.getRelationshipType()); reversed.setRemoveOrphans(source.isRemoveOrphans()); reversed.setSrcHintContainer(source.getDestHintContainer()); reversed.setDestHintContainer(source.getSrcHintContainer()); reversed.setSrcDeepIndexHintContainer(source.getDestDeepIndexHintContainer()); reversed.setDestDeepIndexHintContainer(source.getSrcDeepIndexHintContainer()); }
// iterate through the fields and see wether or not they should be mapped // one way class mappings we do not need to add any fields if (!MappingDirection.ONE_WAY.equals(classMap.getType())) { for (FieldMap fieldMap : fms.toArray(new FieldMap[]{})) { fieldMap.validate(); // If we are dealing with a Map data type, transform the field map into a MapFieldMap type // only apply transformation if it is map to non-map mapping. if (!(fieldMap instanceof ExcludeFieldMap)) { if ((isSupportedMap(classMap.getDestClassToMap()) && !isSupportedMap(classMap.getSrcClassToMap())) || (isSupportedMap(classMap.getSrcClassToMap()) && !isSupportedMap(classMap.getDestClassToMap())) || (isSupportedMap(fieldMap.getDestFieldType(classMap.getDestClassToMap())) && !isSupportedMap(fieldMap.getSrcFieldType(classMap.getSrcClassToMap()))) || (isSupportedMap(fieldMap.getSrcFieldType(classMap.getSrcClassToMap()))) && !isSupportedMap(fieldMap.getDestFieldType(classMap.getDestClassToMap()))) { FieldMap fm = new MapFieldMap(fieldMap); classMap.removeFieldMapping(fieldMap); classMap.addFieldMapping(fm); fieldMap = fm; } }
public static void applyGlobalCopyByReference(Configuration globalConfig, FieldMap fieldMap, ClassMap classMap) { CopyByReferenceContainer copyByReferenceContainer = globalConfig.getCopyByReferences(); String destFieldTypeName = null; Class<?> clazz = fieldMap.getDestFieldType(classMap.getDestClassToMap()); if (clazz != null) { destFieldTypeName = clazz.getName(); } if (copyByReferenceContainer.contains(destFieldTypeName) && !fieldMap.isCopyByReferenceOveridden()) { fieldMap.setCopyByReference(true); } }
result.setSrcField(srcField); result.setDestField(destField); result.setType(type); result.setRelationshipType(relationshipType); result.setRemoveOrphans(removeOrphans); result.setCopyByReference(copyByReference); result.setMapId(mapId); result.setCustomConverter(customConverter); result.setCustomConverterId(customConverterId); result.setCustomConverterParam(customConverterParam); result.setMappingCondition(mappingCondition); result.setMappingConditionId(mappingConditionId); result.setCollectionItemDiscriminator(collectionItemDiscriminator); result.setCollectionItemDiscriminatorId(collectionItemDiscriminatorId); result.setMapNull(mapNull); result.setMapEmptyString(mapEmptyString); result.setTrimString(trimString);
destFieldType = fieldMapping.getDestFieldWriteMethod(destObj.getClass()).getParameterTypes()[0]; } catch (Throwable e) { destFieldType = fieldMapping.getDestFieldType(destObj.getClass()); destFieldType = fieldMapping.getDestFieldType(destObj.getClass()); if (!MappingUtils.isBlankOrNull(fieldMapping.getMappingConditionId())) { .getMappingConditionId()) && conditionObjectsWithId.get(fieldMapping.getMappingConditionId()) != null) { Class<?> srcFieldClass = srcFieldValue != null ? srcFieldValue.getClass() : fieldMapping.getSrcFieldType(srcObj.getClass()); FieldMappingCondition conditionInstance = conditionObjectsWithId.get(fieldMapping.getMappingConditionId()); } else { throw new MappingException( "Mapping condition instance not found with id:" + fieldMapping.getMappingConditionId()); } else if (!MappingUtils.isBlankOrNull(fieldMapping.getMappingCondition())) { Class<?> srcFieldClass = srcFieldValue != null ? srcFieldValue.getClass() : fieldMapping.getSrcFieldType(srcObj.getClass()); Class<?> conditionClass = MappingUtils.loadClass(fieldMapping.getMappingCondition()); if (!MappingUtils.isBlankOrNull(fieldMapping.getCustomConverterId())) { if (customConverterObjectsWithId != null && customConverterObjectsWithId.containsKey(fieldMapping .getCustomConverterId()) && customConverterObjectsWithId.get(fieldMapping.getCustomConverterId()) != null) { .getSrcFieldType(srcObj.getClass()); CustomConverter converterInstance = customConverterObjectsWithId.get(fieldMapping .getCustomConverterId());
fieldMap.validate(); || ( isSupportedMap(fieldMap.getDestFieldType(classMap.getDestClassToMap())) ^ isSupportedMap(fieldMap.getSrcFieldType(classMap.getSrcClassToMap())) ) ) { FieldMap fm = new MapFieldMap(fieldMap); classMap.removeFieldMapping(fieldMap); if (isSupportedMap(classMap.getSrcClassToMap()) && fieldMap.getSrcFieldKey() == null) { DozerField newSrcField = fieldMap.getSrcFieldCopy(); newSrcField.setName(DozerConstants.SELF_KEYWORD); newSrcField.setKey(fieldMap.getSrcFieldName()); fieldMap.setSrcField(newSrcField); if (isSupportedMap(classMap.getDestClassToMap()) && fieldMap.getDestFieldKey() == null) { DozerField newDestField = fieldMap.getDestFieldCopy(); newDestField.setName(DozerConstants.SELF_KEYWORD); newDestField.setKey(fieldMap.getDestFieldName()); fieldMap.setDestField(newDestField); if (!(MappingDirection.ONE_WAY.equals(fieldMap.getType()) && !(fieldMap instanceof ExcludeFieldMap))) { fieldMapPrime = (FieldMap) fieldMap.clone(); fieldMapPrime.setClassMap(classMapPrime); if (fieldMapPrime instanceof ExcludeFieldMap && MappingDirection.ONE_WAY.equals(fieldMap.getType())) { oneWayFieldMap.validate(); if (MappingDirection.ONE_WAY.equals(oneWayFieldMap.getType())) {
private Object mapOrRecurseObject(Object srcObj, Object srcFieldValue, Class<?> destFieldType, Object destObj, FieldMap fieldMap, MappingContext context) { Class<?> srcFieldClass = srcFieldValue != null ? srcFieldValue.getClass() : fieldMap.getSrcFieldType(srcObj .getClass()); CustomConverter converter = MappingUtils.determineCustomConverter(fieldMap, converterByDestTypeCache, customConverterObjects, fieldMap.getClassMap().getCustomConverters(), srcFieldClass, destFieldType); String srcFieldName = fieldMap.getSrcFieldName(); String destFieldName = fieldMap.getDestFieldName(); if (fieldMap.isCopyByReference()) { destFieldType = fieldMap.getDestHintContainer() != null ? fieldMap.getDestHintContainer().getHint() : srcFieldClass; if (fieldMap.getDestHintContainer() != null) { destFieldType = fieldMap.getDestHintContainer().getHint(); DateFormatContainer dfContainer = new DateFormatContainer(fieldMap.getDateFormat()); if (fieldMap.isTrimStrings() && srcFieldValue.getClass().equals(String.class)) { convertSrcFieldValue = ((String) srcFieldValue).trim(); if (MappingUtils.isSupportedCollection(destFieldType) && (!MappingUtils.isBlankOrNull(fieldMap.getCollectionItemDiscriminator()) || !MappingUtils.isBlankOrNull(fieldMap.getCollectionItemDiscriminatorId()))) { Object arrayValue = new Object[]{srcFieldValue}; return mapCollection(srcObj, arrayValue, fieldMap, destObj, context);
fieldMap.validate(); if ((isSupportedMap(classMap.getDestClassToMap()) && !isSupportedMap(classMap .getSrcClassToMap())) || (isSupportedMap(classMap.getSrcClassToMap()) && !isSupportedMap(classMap .getDestClassToMap())) || (isSupportedMap(fieldMap.getDestFieldType(classMap .getDestClassToMap())) && !isSupportedMap(fieldMap.getSrcFieldType(classMap .getSrcClassToMap()))) || (isSupportedMap(fieldMap.getSrcFieldType(classMap .getSrcClassToMap()))) && !isSupportedMap(fieldMap.getDestFieldType(classMap .getDestClassToMap()))) { FieldMap fm = new MapFieldMap(fieldMap); if (!(MappingDirection.ONE_WAY.equals(fieldMap.getType()) && !(fieldMap instanceof ExcludeFieldMap))) { fieldMapPrime = (FieldMap) fieldMap.clone(); fieldMapPrime.setClassMap(classMapPrime); .getType())) { .getCustomConverter()) && StringUtils.isEmpty(oneWayFieldMap.getCustomConverterId())) { if (MappingDirection.ONE_WAY.equals(oneWayFieldMap.getType())) { if (!(fieldMap instanceof MultiSourceFieldMap)) { fieldMapPrime = new ExcludeFieldMap(classMapPrime);
if (fieldMap.getDestHintContainer() == null) { Class<?> genericType = fieldMap.getGenericType(destObj.getClass()); if (genericType != null) { HintContainer destHintContainer = new HintContainer(); destHintContainer.setHintName(genericType.getName()); FieldMap cloneFieldMap = (FieldMap) fieldMap.clone(); cloneFieldMap.setDestHintContainer(destHintContainer); Class<?> destCollectionType = fieldMap.getDestFieldType(destObj.getClass()); Class<?> srcFieldType = srcCollectionValue.getClass(); if (fieldMap instanceof MapFieldMap && (MappingUtils.isSupportedMap(fieldMap.getDestFieldType(destObj.getClass())) || (DozerConstants.SELF_KEYWORD.equals(fieldMap.getDestFieldName())) && MappingUtils.isSupportedMap(fieldMap.getClassMap().getDestClassToMap()))) { destCollectionType = srcFieldType;
private Object mapOrRecurseObject(Object srcObj, Object srcFieldValue, Class<?> destFieldType, FieldMap fieldMap, Object destObj) { Class<?> srcFieldClass = srcFieldValue != null ? srcFieldValue.getClass() : fieldMap.getSrcFieldType(srcObj.getClass()); Class<?> converterClass = MappingUtils.determineCustomConverter(fieldMap, converterByDestTypeCache, fieldMap.getClassMap() .getCustomConverters(), srcFieldClass, destFieldType); String srcFieldName = fieldMap.getSrcFieldName(); String destFieldName = fieldMap.getDestFieldName(); if (fieldMap.isCopyByReference()) { destFieldType = fieldMap.getDestHintContainer() != null ? fieldMap.getDestHintContainer().getHint() : srcFieldClass; if (fieldMap.getDestHintContainer() != null) { destFieldType = fieldMap.getDestHintContainer().getHint(); if (fieldMap.isTrimStrings() && srcFieldValue.getClass().equals(String.class)) { convertSrcFieldValue = ((String) srcFieldValue).trim(); DateFormatContainer dfContainer = new DateFormatContainer(fieldMap.getDateFormat()); if (fieldMap.getDestDeepIndexHintContainer() != null) { destFieldType = fieldMap.getDestDeepIndexHintContainer().getHint();
if (destFieldValue == null && !fieldMap.isDestMapNull()) { bypass = true; if (destFieldValue == null && fieldMap.isDestFieldRequired()) { .getDestFieldCopy().getName())); if (destFieldValue != null && !fieldMap.isDestMapEmptyString() && destFieldValue.getClass() .equals(String.class) && StringUtils.isEmpty((String) destFieldValue)) { bypass = true; if (destFieldValue != null && fieldMap.isTrimStrings() && destFieldValue.getClass().equals(String.class)) { destFieldValue = ((String) destFieldValue).trim(); eventMgr.fireEvent(new DozerEvent(DozerEventType.MAPPING_PRE_WRITING_DEST_VALUE, fieldMap.getClassMap(), fieldMap, srcObj, destObj, destFieldValue)); fieldMap.writeDestValue(destObj, destFieldValue); eventMgr.fireEvent(new DozerEvent(DozerEventType.MAPPING_POST_WRITING_DEST_VALUE, fieldMap.getClassMap(), fieldMap, srcObj, destObj, destFieldValue));
if (fieldMapping instanceof CustomGetSetMethodFieldMap) { try { destFieldType = fieldMapping.getDestFieldWriteMethodParameter(destObj.getClass()); } catch (Throwable e) { destFieldType = fieldMapping.getDestFieldType(BuilderUtil.unwrapDestClassFromBuilder(destObj)); destFieldType = fieldMapping.getDestFieldType(BuilderUtil.unwrapDestClassFromBuilder(destObj)); if (!MappingUtils.isBlankOrNull(fieldMapping.getCustomConverterId())) { if (customConverterObjectsWithId != null && customConverterObjectsWithId.containsKey(fieldMapping.getCustomConverterId())) { Class<?> srcFieldClass = srcFieldValue != null ? srcFieldValue.getClass() : fieldMapping.getSrcFieldType(srcObj.getClass()); destFieldValue = mapUsingCustomConverterInstance(customConverterObjectsWithId.get(fieldMapping.getCustomConverterId()), srcFieldClass, srcFieldValue, destFieldType, destObj, fieldMapping, false); } else { throw new MappingException("CustomConverter instance not found with id:" + fieldMapping.getCustomConverterId()); } else if (MappingUtils.isBlankOrNull(fieldMapping.getCustomConverter())) { destFieldValue = mapOrRecurseObject(srcObj, srcFieldValue, destFieldType, fieldMapping, destObj); } else { Class<?> srcFieldClass = srcFieldValue != null ? srcFieldValue.getClass() : fieldMapping.getSrcFieldType(srcObj.getClass()); destFieldValue = mapUsingCustomConverter(MappingUtils.loadClass(fieldMapping.getCustomConverter()), srcFieldClass, srcFieldValue, destFieldType, destObj, fieldMapping, false); log.debug(logMsgFactory.createFieldMappingSuccessMsg(srcObj.getClass(), destObj.getClass(), fieldMapping.getSrcFieldName(), fieldMapping.getDestFieldName(), srcFieldValue, destFieldValue, fieldMapping.getClassMap().getMapId()));
Object field = fieldMap.getDestValue(destObj); if (field != null) { result.addAll((Collection<?>) field); Class<?> prevDestEntryType = null; for (Object srcValue : srcCollectionValue) { if (destEntryType == null || (fieldMap.getDestHintContainer() != null && fieldMap.getDestHintContainer() .hasMoreThanOneHint())) { if (srcValue == null) { destEntryType = prevDestEntryType; } else { destEntryType = fieldMap.getDestHintType(srcValue.getClass()); if ((usesCollectionItemDiscriminator(fieldMap) || RelationshipType.NON_CUMULATIVE.equals(fieldMap.getRelationshipType())) && result.contains(destValue)) { List<Object> resultAsList = new ArrayList<Object>(result); int index = resultAsList.indexOf(destValue); if (fieldMap.isRemoveOrphans()) { result.clear(); result.addAll(mappedElements); Class<? extends Set<?>> destSetType = (Class<? extends Set<?>>) fieldMap.getDestFieldType(destObj .getClass()); return CollectionUtils.createNewSet(destSetType, result);
private void mapFromIterateMethodFieldMap(Object srcObj, Object destObj, Object srcFieldValue, FieldMap fieldMapping) { // Iterate over the destFieldValue - iterating is fine unless we are mapping // in the other direction. // Verify that it is truly a collection if it is an iterator object turn it // into a List if (srcFieldValue instanceof Iterator) { srcFieldValue = IteratorUtils.toList((Iterator<?>) srcFieldValue); } if (srcFieldValue != null) { for (int i = 0; i < CollectionUtils.getLengthOfCollection(srcFieldValue); i++) { final Object value = CollectionUtils.getValueFromCollection(srcFieldValue, i); // map this value if (fieldMapping.getDestHintContainer() == null) { MappingUtils.throwMappingException("<field type=\"iterate\"> must have a source or destination type hint"); } Class<?> destinationHint = fieldMapping.getDestHintType(value.getClass()); Object result = mapOrRecurseObject(srcObj, value, destinationHint, fieldMapping, destObj); if (value != null) { writeDestinationValue(destObj, result, fieldMapping, srcObj); } } } if (log.isDebugEnabled()) { log.debug(logMsgFactory.createFieldMappingSuccessMsg(srcObj.getClass(), destObj.getClass(), fieldMapping.getSrcFieldName(), fieldMapping.getDestFieldName(), srcFieldValue, null, fieldMapping.getClassMap().getMapId())); } }
Object field = fieldMap.getDestValue(destObj); if (field != null) { result.addAll((Collection<?>) field); for (Object srcValue : srcCollectionValue) { if (destEntryType == null || (fieldMap.getDestHintContainer() != null && fieldMap.getDestHintContainer().hasMoreThanOneHint())) { destEntryType = determineCollectionItemType(fieldMap, destObj, srcValue, prevDestEntryType); if (RelationshipType.NON_CUMULATIVE.equals(fieldMap.getRelationshipType()) && result.contains(destValue)) { List<Object> resultAsList = new ArrayList<Object>(result); mapToDestObject(null, srcValue, obj, false, fieldMap.getMapId()); mappedElements.add(obj); if (destValue != null || fieldMap.isDestMapNull()) { result.add(destValue); if (fieldMap.isRemoveOrphans()) { result.clear(); result.addAll(mappedElements); Class<? extends Set<?>> destSetType = (Class<? extends Set<?>>) fieldMap.getDestFieldType(destObj.getClass()); return CollectionUtils.createNewSet(destSetType, result); } else {
srcFieldValue = fieldMapping.getSrcFieldValue(srcObj); boolean fieldMapped = false; if (customFieldMapper != null) { fieldMapped = customFieldMapper.mapField(srcObj, destObj, srcFieldValue, fieldMapping.getClassMap(), fieldMapping); if (!(fieldMapping instanceof MultiSourceFieldMap) && fieldMapping.getDestFieldType() != null && ITERATE.equals(fieldMapping.getDestFieldType()) ) { if (fieldMapping.isStopOnErrors()) { MappingUtils.throwMappingException(e); } else { if (!fieldMapping.getClassMap().getAllowedExceptions().isEmpty() && e.getCause() instanceof InvocationTargetException) { Throwable thrownType = ((InvocationTargetException) e.getCause()).getTargetException(); Class<? extends Throwable> exceptionClass = thrownType.getClass(); if (fieldMapping.getClassMap().getAllowedExceptions().contains(exceptionClass)) { throw (RuntimeException) thrownType;
if (!DozerConstants.ITERATE.equals(fieldMap.getDestFieldType())) { result = getExistingValue(fieldMap, destObj, destFieldType); if (fieldMap.getDestHintContainer() != null) { Class<?> destHintType = fieldMap.getDestHintType(srcFieldValue.getClass()); String mapId = fieldMap.getMapId(); if (fieldMap.getDestHintContainer() != null && fieldMap.getDestHintContainer().getHint() != null) { targetClass = fieldMap.getDestHintContainer().getHint(); } else { targetClass = destFieldType; fieldMap.getDestFieldCreateMethod() != null ? fieldMap.getDestFieldCreateMethod() : classMap.getDestClassCreateMethod()); result = createByCreationDirectiveAndMap(creationDirective, classMap, srcFieldValue, null, false, fieldMap.getMapId()); } else { mapToDestObject(null, srcFieldValue, result, false, fieldMap.getMapId());