package gw.plugin.integration.mapping uses gw.api.locale.DisplayKey uses com.guidewire.pl.web.controller.UserDisplayableException uses gw.api.util.mapping.GWObjectUtils uses gw.api.util.mapping.IFieldMapper uses gw.api.util.mapping.ObjectConverter uses gw.lang.reflect.IPropertyInfo uses java.util.Calendar uses java.util.Date abstract class FieldMapperBase implements IFieldMapper { construct() { } override function mapField(converter : ObjectConverter, source : Object, target : Object, sourceProperty : IPropertyInfo) { var sourcePropertyName = sourceProperty.getName() try { var newProperty = getTargetProperty((typeof target), sourceProperty) if (newProperty != null && newProperty.Writable) { var propertyValue : Object if (gw.api.util.TypeUtil.isNominallyOrStructurallyAssignable(String.Type, sourceProperty.FeatureType) && GWObjectUtils.isEnumType(newProperty.FeatureType)) { var newTypecodeWithPrefix = converter.getTranslator() .translateTypeCode(newProperty.FeatureType.RelativeName, source[sourcePropertyName] as String) propertyValue = GWObjectUtils.getTypeKeyFromCode(newTypecodeWithPrefix, newProperty.FeatureType) } else { propertyValue = converter.convert(source[sourcePropertyName], sourceProperty.FeatureType) } // SOAP entities use Calendar instead of Date if (propertyValue typeis Date && gw.api.util.TypeUtil.isNominallyOrStructurallyAssignable(Calendar.Type, newProperty.FeatureType)) { var cal = Calendar.getInstance() cal.setTime(propertyValue) propertyValue = cal } else if (propertyValue typeis Calendar && gw.api.util.TypeUtil.isNominallyOrStructurallyAssignable(Date.Type, newProperty.FeatureType)) { var cal2 = propertyValue propertyValue = cal2.Time } // SOAP entities have NULL for empty arrays if (propertyValue == null && newProperty.FeatureType.Array && newProperty.FeatureType.ComponentType.Namespace == "entity") { propertyValue = newProperty.FeatureType.ComponentType.makeArrayInstance(0) } if (propertyValue typeis Object[] && propertyValue.length == 0) { var newPropertyType = (typeof target).TypeInfo.getProperty(newProperty.Name).FeatureType propertyValue = newPropertyType.ComponentType.makeArrayInstance(0) } target[newProperty.Name] = propertyValue } } catch (e : UserDisplayableException) { throw new UserDisplayableException(DisplayKey.get("Integration.FieldMapper.CannotMapField", sourcePropertyName, source.toString(), target.toString()), e.Cause) } } abstract function getTargetProperty(targetType : Type, sourceProperty : IPropertyInfo) : IPropertyInfo abstract function getTargetFieldName(sourceProperty : IPropertyInfo) : String }