internal void MapOutbound( SifXPathContext context, IFieldAdaptor adaptor, SifElement dataObject, ICollection<FieldMapping> fields, IValueBuilder valueBuilder, SifVersion version) { #if PROFILED if( BuildOptions.PROFILED ){ ProfilerUtils.profileStart( String.valueOf( com.OpenADK.sifprofiler.api.OIDs.ADK_OUTBOUND_TRANSFORMATIONS ), dataObject.getElementDef(), null ); } #endif SifFormatter textFormatter = Adk.TextFormatter; FieldMapping lastRule = null; try { foreach (FieldMapping fm in fields) { lastRule = fm; String fieldName = fm.Alias; if (fieldName == null) { fieldName = fm.FieldName; } if (fieldName == null || fieldName.Length == 0) { throw new AdkMappingException( "Mapping rule for " + dataObject.ElementDef.Name + "[" + fm.FieldName + "] must specify a field name", null); } if (adaptor.HasField(fieldName) || fm.HasDefaultValue) { // // For outbound mapping operations, only process // XPathRules. All other rule types, like OtherIdRule, // are only intended to be used for inbound mappings. // if (fm.fRule is XPathRule) { XPathRule rule = (XPathRule) fm.fRule; // Lookup or create the element/attribute referenced by the rule String ruledef = rule.XPath; if (ruledef == null || ruledef.Trim().Length == 0) { throw new AdkMappingException( "Mapping rule for " + dataObject.ElementDef.Name + "[\"" + fieldName + "\"] must specify a path to an element or attribute", null); } // TT 199 If the FieldMapping has an "ifnull" value of "suppress", // don't render a result // Determine if this element should be created before attempting to create it // If the value resolves to null and the IFNULL_SUPPRESS flag is set, the element // should not be created. That's why we have to look up the ElementDef first TypeConverter typeConverter = null; IElementDef def = rule.LookupTargetDef(dataObject.ElementDef); if (def != null) { typeConverter = def.TypeConverter; } if (typeConverter == null) { typeConverter = SifTypeConverters.STRING; // TODO: Perhaps the following exception should be thrown when // in STRICT mode // throw new ADKMappingException( "Element {" + def.name() + // "} from rule \"" + ruledef + "\" does not have a data type definition.", null ); } SifSimpleType mappedValue; mappedValue = adaptor.GetSifValue(fieldName, typeConverter, fm); // Perform a valueset translation, if applicable if (mappedValue != null && mappedValue is SifString && fm.ValueSetID != null) { String textValue = mappedValue.ToString(); // Perform automatic ValueSet translation ValueSet vs = GetValueSet(fm.ValueSetID, true); if (vs != null) { // TT 199. Perform a more detailed valueset translation. // If there is a default value for this field, use it if there is // no match found in the value set textValue = vs.Translate(textValue, fm.DefaultValue); } mappedValue = new SifString(textValue); } bool usedDefault = false; if (mappedValue == null || mappedValue.RawValue == null) { // If the FieldMapping has a Default value, use that, unless // it is explicitly suppressed if (fm.NullBehavior != MappingBehavior.IfNullSuppress && fm.HasDefaultValue) { mappedValue = fm.GetDefaultValue(typeConverter, textFormatter); usedDefault = true; } else { continue; } } if (!usedDefault) { String valueExpression = rule.ValueExpression; if (valueExpression != null) { // This XPath rule has a value assignment expression at the end of it String value = valueBuilder.Evaluate(valueExpression); mappedValue = typeConverter.Parse(textFormatter, value); } } // If we have a null value to assign at this point, move on to the next rule if (mappedValue == null || mappedValue.RawValue == null) { continue; } // At this point, mappedValue should not be null. We are committeed // to building out the path and setting the value. INodePointer pointer = rule.CreatePath(context, version); // If the element/attribute does not have a value, assign one. // If it does have a value, it was already assigned by the XPath // rule in the lookupByXPath method above and should not be // changed. // if (pointer != null) { Element pointedElement = (Element) pointer.Value; SifSimpleType elementValue = pointedElement.SifValue; if (elementValue == null || elementValue.RawValue == null) { if (mappedValue is SifString) { // Now that we have the actual element, we may need to create convert the // data if we were unable to resolve the TypeConverter above. This only happens // in cases involving surrogates where the rule.lookupTargetDef( dataObject.getElementDef() ); // fails to find the target ElementDef TypeConverter converter = pointedElement.ElementDef.TypeConverter; if (converter != null && converter.DataType != mappedValue.DataType) { mappedValue = converter.Parse(textFormatter, mappedValue.ToString()); } } // This check for null should really not be necessary, // however keepingit in for now if (mappedValue != null) { pointedElement.SifValue = mappedValue; } } } } } } } catch (Exception e) { if (lastRule != null) { throw new AdkMappingException( "Unable to evaluate field rule: " + lastRule.fRule + " : " + e.Message, null, e); } throw new AdkMappingException(e.ToString(), null, e); } #if PROFILED finally { if( BuildOptions.PROFILED ) ProfilerUtils.profileStop(); } #endif }
internal void MapInbound( SifXPathContext xpathContext, IFieldAdaptor results, SifElement inboundObject, ICollection<FieldMapping> fields, SifVersion version) { #if PROFILED if( BuildOptions.PROFILED ){ ProfilerUtils.profileStart( String.valueOf( com.OpenADK.sifprofiler.api.OIDs.ADK_INBOUND_TRANSFORMATIONS ), inboundObject.getElementDef(), null ); } #endif FieldMapping lastRule = null; try { foreach (FieldMapping rule in fields) { lastRule = rule; if (!results.HasField(rule.FieldName)) { SifSimpleType val = rule.Evaluate(xpathContext, version, true); if (val != null) { if (rule.ValueSetID != null && val is SifString) { String currentValue = val.ToString(); // Perform automatic ValueSet translation // TT 199. Perform a more detailed valueset translation. // If there is a default value set, use it if there is // no match found in the value set ValueSet vs = GetValueSet(rule.ValueSetID, true); if (vs != null) { currentValue = vs.TranslateReverse(currentValue, rule.DefaultValue); } val = new SifString(currentValue); } results.SetSifValue(rule.FieldName, val, rule); } } } } catch (Exception e) { if (lastRule != null) { throw new AdkMappingException( "Unable to evaluate field rule: " + lastRule.fRule + " : " + e.Message, null, e); } throw new AdkMappingException(e.ToString(), null, e); } }