Esempio n. 1
0
        /**
         *  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;
			}
		}
	}