/** * SIF_Request */ public SIF_Ack SifRequest(IZone zone, Query query, String destinationId, String sifMsgId) { // Send SIF_Request... SIF_Request msg = new SIF_Request(); // Find the maxmimum requested version and set the version of the message to lower // if the version is currently higher than the highest requested version. // In other words, if the Adk is initialized to 2.0, but the highest requested version // is 1.5r1, set the message version to 1.5r1 SifVersion highestRequestVersion = SifVersion.SIF11; if (query.ObjectType == InfraDTD.SIF_ZONESTATUS) { // This query will be satisfied by the ZIS. Use the ZIS compatibility // version, which returns the highest version supported by the ZIS // (Default to Adk.SIFVersion() if not specified in the config) highestRequestVersion = ((ZoneImpl)zone).HighestEffectiveZISVersion; msg.AddSIF_Version(new SIF_Version(highestRequestVersion)); } else { SifVersion[] requestVersions = query.SifVersions; if (requestVersions.Length > 0) { // If the Query has one or more SIFVersions set, use them, // and also add [major].* foreach (SifVersion version in requestVersions) { msg.AddSIF_Version(new SIF_Version(version)); if (version.CompareTo(highestRequestVersion) > 0) { highestRequestVersion = version; } } } else { highestRequestVersion = Adk.SifVersion; if (highestRequestVersion.Major == 1) { msg.AddSIF_Version(new SIF_Version(highestRequestVersion)); } else { // 2.0 and greater, request all data using // [major].*, with 2.0r1 as the message version // This allows for maximum compatibility will all 2.x providers msg.AddSIF_Version(new SIF_Version(highestRequestVersion.Major + ".*")); msg.SifVersion = SifVersion.GetEarliest(highestRequestVersion.Major); } } } AgentProperties zoneProperties = zone.Properties; if (zoneProperties.OverrideSifMessageVersionForSifRequests != null) { //There is a property in Agent.cfg that can be used to override the message version from the //default of 2.0r1 This is needed to pass the test harness for 2.3 msg.SifVersion = SifVersion.Parse(zoneProperties.OverrideSifMessageVersionForSifRequests); } else if (msg.SifVersion.CompareTo(highestRequestVersion) > 0) { // The current version of the SIF_Message is higher than the highest // requested version. Back the version number of message down to match msg.SifVersion = highestRequestVersion; } msg.SIF_MaxBufferSize = zone.Properties.MaxBufferSize; SIF_Query sifQ = CreateSIF_Query(query, highestRequestVersion, zone); msg.SIF_Query = sifQ; SIF_Header msgHeader = msg.Header; if (destinationId != null) { msgHeader.SIF_DestinationId = destinationId; } if (sifMsgId != null) { msgHeader.SIF_MsgId = sifMsgId; } // Set the SIF_Context msgHeader.SIF_Contexts = new SIF_Contexts( new SIF_Context(query.SifContext.Name)); return(((ZoneImpl)zone).Dispatcher.send(msg)); }
private void SetRequestPolicy( SIF_Request request, IZone zone ) { SIF_Query query = request.SIF_Query; if( query == null ) { // SIF_ExtendedQuery and SIF_Example are not supported by ADK Policy yet return; } // // Object Request Policy // // Determine if there is policy in effect for this Query // String objectName = query.SIF_QueryObject.ObjectName; ObjectRequestPolicy requestPolicy = fPolicyFactory.GetRequestPolicy( zone, objectName ); if( requestPolicy != null ){ // // SIF_Request/SIF_Version policy // String requestVersions = requestPolicy.RequestVersion; if( requestVersions != null ){ if( (Adk.Debug & AdkDebugFlags.Policy ) > 0 ){ zone.Log.Info( "POLICY: Setting SIF_Request/SIF_Version to " + requestVersions ); } // Clear the list of SIF Versions foreach( SIF_Version existingVersion in request.GetSIF_Versions() ){ request.RemoveChild( existingVersion ); } // The version will be a comma-delimited list. Set each of these // as SIF_Version elements, but also try to derive the most logical // version element to set the SIF Message/@Version attribute to // NOTE: Someone could theoretically set versions incorrectly, such // as "1.1,1.5r1". Multiple SIF_Version elements are not supported in // SIF 1.x, but we won't bother with validating incorrect settings. Policy // is power in the configurator's hands to use or abuse. String[] versions = requestVersions.Split( ',' ); String lowestVersion = versions[0]; foreach( String version in versions ){ String ver = version.Trim(); request.AddSIF_Version(new SIF_Version(ver)); if (lowestVersion.CompareTo(ver) > 0) { lowestVersion = ver; } } // Determine how the SIF_Message/@Version should be set to // * If the policy is set to a single version, use it // * If a list, use the lowest // * If *, ignore // * if [major].*, use the lowest version supported if( lowestVersion.Length > 0 ){ SifVersion newMsgVersion = null; if( lowestVersion.EndsWith( "*" ) ){ try { // 2.*, requests go out with a message version of 2.0r1 int major = int.Parse( lowestVersion.Substring( 0, 1 ) ); newMsgVersion = SifVersion.GetEarliest( major ); } catch( FormatException iae ){ zone.Log.Warn( "POLICY: Error parsing ObjectRequestPolicy version '" + requestVersions + "' : " + iae.Message, iae ); } } else { try { newMsgVersion = SifVersion.Parse( lowestVersion ); } catch( FormatException iae ){ zone.Log.Warn( "POLICY: Error parsing ObjectRequestPolicy version '" + requestVersions + "' : " + iae.Message, iae ); } } if( newMsgVersion != null ){ if( (Adk.Debug & AdkDebugFlags.Policy ) > 0 ){ zone.Log.Info( "POLICY: Setting SIF_Messaage/@Version to " + newMsgVersion ); } request.SifVersion = newMsgVersion; } } } // // SIF_DestinationID policy // String requestSourceId = requestPolicy.RequestSourceId ; if( requestSourceId != null ){ if( (Adk.Debug & AdkDebugFlags.Policy) > 0 ){ zone.Log.Info( "POLICY: Setting SIF_Request SIF_DestinationID to " + requestPolicy.RequestSourceId ); } request.SIF_Header.SIF_DestinationId = requestSourceId; } } }